A question on modification of a list via a function invocation

Ned Batchelder ned at nedbatchelder.com
Mon Aug 14 15:53:22 EDT 2017


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.



More information about the Python-list mailing list