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