help?? on functions
lokeshkoppaka at gmail.com
lokeshkoppaka at gmail.com
Mon May 27 03:20:47 EDT 2013
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
More information about the Python-list
mailing list