0
a = [1]

def do():
    global a
    b=a
    print b
    a[0] = 2
    print b

do()

输出:1 2

我很确定这与“a”是一个全局列表这一事实有关。有人可以向我解释为什么全局变化时变量 b 会发生变化。我怎么可能阻止它发生?

问题的扩展:您将如何处理进一步的嵌套,例如:

a = []
b = []
def do():
    global a, b
    b.append(a[:])
    print a, b
    a[0][0] +=1
    print a, b

a.append([1])
do()
4

3 回答 3

1

在这一行b=a中,您实际上创建了一个引用 b,它指向 a。这在 python 中不会创建列表的新副本,而只是创建指向它的新链接。

如果要创建副本,a则需要明确执行。使用列表推导,您可以这样做:

b = a[:]

这将创建一个将被 b 引用的 a 的副本。看看它在行动:


>>> a = [1]
>>> b = a #Same list
>>> a[0] = 2
>>> b
[2] #Problem you are experiencing

您可以通过以下方式亲自查看它们是否引用相同的对象:

>>> a is b
True

true 表示它们指的是同一个对象。

>>> b = a[:] #Solution <<--------------

再次做同样的测试:

>>> a is b
False

并且问题解决了。它们现在指代不同的对象。

>>> b
[2]
>>> a[0] = 3 #a changed
>>> a
[3]
>>> b
[2] #No change here
于 2013-01-13T07:36:54.930 回答
0

当您分配时,您将b = a引用复制到保存到的列表对象中ab因此它们指向同一个列表。对基础对象的更改将通过任一引用反映出来。

如果要创建列表的副本,请使用

b = list(a)

或者,一种适用于大多数对象的方法:

import copy
b = copy.copy(a)
于 2013-01-13T07:43:53.927 回答
0

我认为您对python的变量模型有误解。这是我读到的文章,它让我点击了(“其他语言有变量”和“Python 有名称”部分)。

于 2013-01-13T07:47:38.400 回答