On Monday, May 27, 2013 11:18:34 AM UTC+5:30, Steven D'Aprano wrote: > On Sun, 26 May 2013 21:48:34 -0700, lokeshkoppaka wrote: > > > > > 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? > > > > > > -- > > Steven
Steven wow, wonderful explanation ,i got it thanks a lot -- http://mail.python.org/mailman/listinfo/python-list