On 8/14/17 3:21 PM, Mok-Kong Shen wrote: > Am 14.08.2017 um 20:50 schrieb Ned Batchelder: >> On 8/14/17 2:21 PM, Mok-Kong Shen wrote: >>> I ran the attached program and got the following output: >>> >>> [1, 2, 3] >>> [3, 6, 9] >>> >>> I don't understand why the modification doesn't work in the case of >>> test() but does work in the case of test1(). >>> >>> Thanks for your help in advance. >>> >>> M. K. Shen >>> >>> ------------------------------------------------------------ >>> >>> def test(alist): >>> alist=[3,6,9] >>> return >>> >>> def test1(alist): >>> alist[0],alist[1],alist[2]=3,6,9 >>> return >>> >>> ss=[1,2,3] >>> test(ss) >>> print(ss) >>> test1(ss) >>> print(ss) >> >> This reassigns the name alist: alist = [3, 6, 9]. That changes the >> local variable, but cannot affect the caller's variables. >> >> This leaves alist as the same object, but reassigns its elements, >> mutating the list: alist[0] = 3 >> >> This talk has more details: https://nedbatchelder.com/text/names1.html > > I could more or less understand that in test() alist is interpreted as > local but in the extended program below in test2() I first write the > same as in test1(), after which I logically assume that the name alist > is now known as global and then I write alist=[30,60,90] but that > doesn't have any effect globally, since I get the output: > > [1, 2, 3] > [3, 6, 9] > [3, 6, 9] > > Could you please explain that? > > M. K. Shen > --------------------------------------------------------- > > def test(alist): > alist=[3,6,9] > return > > def test1(alist): > alist[0],alist[1],alist[2]=3,6,9 > return > > def test2(alist): > alist[0],alist[1],alist[2]=3,6,9 > alist=[30,60,90] > return > > ss=[1,2,3] > test(ss) > print(ss) > test1(ss) > print(ss) > test2(ss) > print(ss)
Your test2 function first mutates the caller's list by assigning alist[0]=3, then it rebinds the local name alist to be a new list. So the caller's list is now [3, 6, 9]. --Ned. -- https://mail.python.org/mailman/listinfo/python-list