python:全局编辑时列出更改

时间:2013-01-13 07:34:59

标签: python python-2.7

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()

3 个答案:

答案 0 :(得分:1)

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

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

b = a[:]

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


>>> 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

答案 1 :(得分:0)

当您指定b = a时,您正在将对a中的列表对象的引用复制到b,因此它们指向同一列表。对基础对象的更改将通过引用反映出来。

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

b = list(a)

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

import copy
b = copy.copy(a)

答案 2 :(得分:0)

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