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()
答案 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有名字”这些部分)。