A question on modification of a list via a function invocation

Larry Hudson orgnut at yahoo.com
Mon Aug 14 23:25:15 EDT 2017


On 08/14/2017 01:02 PM, Mok-Kong Shen wrote:
> Am 14.08.2017 um 21:53 schrieb Ned Batchelder:
[snip]

>>> 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].
> 
> Sorry for my poor knowledge. After the line alist[0]..., what is the
> status of the name alist? It's now a global name, right? So why in the
> line following that the name alist would suddenly be interpreted as
> local? I can't yet fully comprehend the logic behind that.
> 
> M. K. Shen
Here is my attempt to clarify the situation with some ascii graphics.
(Well, not ascii, but utf-8 box-drawing characters — I hope they come through ok.
And, of curse, it won't display properly with a proportional font.)

The left side is the program lines, and the right side tries to show the way Python implements 
the name binding to the data in memory.  (But I abbreviated the long assignment line,
alist[0],alist[1],alist[2]=3,6,9 to <assignment>)

Program line          Variable bound to memory

===========  Initial assignment  ============

ss = [1, 2, 3]              ss ───> [1, 2, 3]

===============  test() code  ===============

def test(alist):            ss ─┬─> [1, 2, 3]
                          alist ─┘
---------------------------------------------
     alist = [3, 6, 9]       ss ───> [1, 2, 3]
                          alist ───> [3, 6, 9]
---------------------------------------------
     return                  ss ───> [1, 2, 3]
                          alist <Garbage collected>

===============  test1() code  ==============
def test1(alist):           ss ─┬─> [1, 2, 3]
                          alist ─┘
---------------------------------------------
     <assignment>            ss ─┬─> [3, 6, 9]
                          alist ─┘
---------------------------------------------
     return                  ss ───> [3, 6, 9]
                          alist <Garbage collected>

===============  test2() code  ==============
def test2(alist):           ss ─┬─> [1, 2, 3]
                          alist ─┘
---------------------------------------------
     <assignment>           ss ─┬─> [3, 6, 9]
                         alist ─┘
---------------------------------------------
     alist = [30, 60, 90]    ss ───> [3, 6, 9]
                          alist ───> [30, 60, 90]
---------------------------------------------
     return                  ss ───> [3, 6, 9]
                          alist <Garbage collected>

-- 
      -=- Larry -=-



More information about the Python-list mailing list