A question on modification of a list via a function invocation

Mok-Kong Shen mok-kong.shen at t-online.de
Mon Aug 14 15:21:45 EDT 2017


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)



More information about the Python-list mailing list