设置了一个变量。另一个变量设置为第一个。第一个更改值。第二个没有。这是编程的本质,从时间的黎明开始。

>>> a = 1
>>> b = a
>>> b = b - 1
>>> b
0
>>> a
1

然后我将其扩展到Python列表。声明并附加一个列表。另一个列表被声明为等于第一个列表。第二个列表中的值将更改奇怪的是,第一个列表中的值虽然没有直接作用,但也发生了变化。
>>> alist = list()
>>> blist = list()
>>> alist.append(1)
>>> alist.append(2)
>>> alist
[1, 2]
>>> blist
[]
>>> blist = alist
>>> alist.remove(1)
>>> alist
[2]
>>> blist
[2]
>>>

这是为什么?
我该如何防止这种情况发生——我希望alist不受blist更改的影响(如果您愿意的话,是不可变的)?

最佳答案

Python中的变量绑定是这样工作的:将对象赋给变量。

a = 4
b = a

两者都指向4
b = 9

现在b指向其他地方。
列表也会发生同样的情况:
a = []
b = a
b = [9]

现在,b有一个新值,而a有一个旧值。
到目前为止,一切都很清楚,对于可变和不可变的对象,您有相同的行为。
现在你的误解来了:它是关于修改对象的。
cc是可变的,所以如果您对列表进行了更改,那么修改是通过所有变量(“名称绑定”)可见的:
a = []
b = a  # the same list
c = [] # another empty one

a.append(3)
print a, b, c # a as well as b = [3], c = [] as it is a different one

d = a[:] # copy it completely
b.append(9)
# now a = b = [3, 9], c = [], d = [3], a copy of the old a resp. b

10-07 16:01
查看更多