Am 14.08.2017 um 22:10 schrieb oliver:
It is not a global because accessing an item of a list does not change
whether it is global or local. It would only be global if you declared it
global via a "global" statement. Can you give an example, that would help
determine the issue.

If without a global statement, a name is local, then alist[0]=3 should
not work globally, if it works at all, in my layman's logic.

M. K. Shen

On Mon, 14 Aug 2017 at 16:06 Mok-Kong Shen <mok-kong.s...@t-online.de>
wrote:

Am 14.08.2017 um 21:53 schrieb Ned Batchelder:
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].

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


   .

--
https://mail.python.org/mailman/listinfo/python-list


--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to