help?? on functions

L

lokeshkoppaka

def shuffle(input, i, j):
pass
input = input[i:j+1] +input[0:i] + input[j+1:]
def test_shuffle():
input = [1, 2, 3, 4, 5, 6]
shuffle(input, 1, 2)
assert [2, 3, 1, 4, 5, 6] == input


i had done the above code but the problem is i had manipulated the "input" in function shuffle(input, i, j) but once i get back to the test_shuffle() function again the variable "input" does not reflect the changes made in shuffle(input, i, j) why ,please can any one describe why . and help how to reflect that change to the variable "input".
 
S

Steven D'Aprano

def shuffle(input, i, j):
pass
input = input[i:j+1] +input[0:i] + input[j+1:]

"pass" does nothing. Take it out.


def test_shuffle():
input = [1, 2, 3, 4, 5, 6]
shuffle(input, 1, 2)
assert [2, 3, 1, 4, 5, 6] == input


i had done the above code but the problem is i had manipulated the
"input" in function shuffle(input, i, j) but once i get back to the
test_shuffle() function again the variable "input" does not reflect the
changes made in shuffle(input, i, j) why ,please can any one describe
why . and help how to reflect that change to the variable "input".

The line of code:

input = input[i:j+1] +input[0:i] + input[j+1:]


takes the input list, makes three slices from that list, creates a new
list, and then reassigns the LOCAL variable "input". This does not touch
the variable on the outside of the function.

This will be more clear if you use different names:

# Outside the function.
mylist = [1, 2, 3, 4, 5, 6]
shuffle(mylist, 1, 2)


Inside the function "shuffle", "input" is a local variable, and when you
reassign to it, the variable "mylist" on the outside is not changed. Try
this small function to see what I mean:

def demo(input):
print('local variable, before:', input)
input = 100
print('local variable, after:', input)
print('non-local variable', mylist)


mylist = [1, 2, 3, 4, 5, 6]
demo(mylist)



So, what can you do to fix this? You have two choices:


1) You can return the shuffled list. Add this line to the end of your
shuffle function:

return input


and then inside the test function, do this:

def test_shuffle():
input = [1, 2, 3, 4, 5, 6]
input = shuffle(input, 1, 2)
assert [2, 3, 1, 4, 5, 6] == input


2) You can modify the input list in place.

In this case, instead of reassigning the local variable "input" with the
new list, you simply tell Python to stuff the new list inside the
original list. You do that with a slice:


input[:] = input[i:j+1] + input[0:i] + input[j+1:]


That's a small difference from what you wrote, just three characters [:],
but it makes a big difference in the effect. Instead of reassigning the
local variable to the new list, it takes the existing list, and replaces
each value inside it with the values taken from the new list. For example:


py> mylist = [100, 200, 300, 400, 500, 600]
py> mylist[3:5] = ['A', 'B', 'C']
py> mylist
[100, 200, 300, 'A', 'B', 'C', 600]

py> mylist[1:] = [99, 98, 97]
py> mylist
[100, 99, 98, 97]


Any questions?
 
L

lokeshkoppaka

def shuffle(input, i, j):

input = input[i:j+1] +input[0:i] + input[j+1:]



"pass" does nothing. Take it out.






def test_shuffle():
input = [1, 2, 3, 4, 5, 6]
shuffle(input, 1, 2)
assert [2, 3, 1, 4, 5, 6] == input
i had done the above code but the problem is i had manipulated the
"input" in function shuffle(input, i, j) but once i get back to the
test_shuffle() function again the variable "input" does not reflect the
changes made in shuffle(input, i, j) why ,please can any one describe
why . and help how to reflect that change to the variable "input".



The line of code:



input = input[i:j+1] +input[0:i] + input[j+1:]





takes the input list, makes three slices from that list, creates a new

list, and then reassigns the LOCAL variable "input". This does not touch

the variable on the outside of the function.



This will be more clear if you use different names:



# Outside the function.

mylist = [1, 2, 3, 4, 5, 6]

shuffle(mylist, 1, 2)





Inside the function "shuffle", "input" is a local variable, and when you

reassign to it, the variable "mylist" on the outside is not changed. Try

this small function to see what I mean:



def demo(input):

print('local variable, before:', input)

input = 100

print('local variable, after:', input)

print('non-local variable', mylist)





mylist = [1, 2, 3, 4, 5, 6]

demo(mylist)







So, what can you do to fix this? You have two choices:





1) You can return the shuffled list. Add this line to the end of your

shuffle function:



return input





and then inside the test function, do this:



def test_shuffle():

input = [1, 2, 3, 4, 5, 6]

input = shuffle(input, 1, 2)

assert [2, 3, 1, 4, 5, 6] == input





2) You can modify the input list in place.



In this case, instead of reassigning the local variable "input" with the

new list, you simply tell Python to stuff the new list inside the

original list. You do that with a slice:





input[:] = input[i:j+1] + input[0:i] + input[j+1:]





That's a small difference from what you wrote, just three characters [:],

but it makes a big difference in the effect. Instead of reassigning the

local variable to the new list, it takes the existing list, and replaces

each value inside it with the values taken from the new list. For example:





py> mylist = [100, 200, 300, 400, 500, 600]

py> mylist[3:5] = ['A', 'B', 'C']

py> mylist

[100, 200, 300, 'A', 'B', 'C', 600]



py> mylist[1:] = [99, 98, 97]

py> mylist

[100, 99, 98, 97]





Any questions?

Steven
wow, wonderful explanation ,i got it thanks a lot
 
J

John Ladasky

Steven gave you a lot of good advice. Let me add just one remark.

Python already has a builtin function called "input." If you define a variable with the same name as a builtin and then you try to use that builtin, you will be in for a (usually unpleasant) surprise.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,138
Messages
2,570,803
Members
47,348
Latest member
nethues

Latest Threads

Top