如果我有这个Python代码:

foo = [3, 5, 9]
bar = foo
bar.append(9)
print(foo)

它又回来了
[3, 5, 9, 9]

这肯定意味着,当我将9附加到bar时,它也会影响foo如何使变量bar等于foo,但在我编辑bar时,它不会影响foo

最佳答案

您正在更改可变值,因此需要进行显式复制:

bar = list(foo)


bar = foo[:]

在python中为名称赋值时,只需存储对该值的引用。在不创建列表副本的情况下,foobar都引用同一个列表。
对于不可变的值,这不是问题;而是替换对字符串的引用以指向其他值。
但是列表(和dictset以及大多数类的实例)是可变的。您没有更改foo,而是更改了foo所指的值。您确实foo.append(9),Python将其视为:
找到foo所指的值。
找到该值的属性.append。这将返回列表实例上的方法。
调用方法,传入值9。这改变了名单。
python名称本身只不过是指向实际值的标签。您可以将值视为气球,将名称视为小纸牌,而赋值就是将标签绑定到气球的行为。bar = foo创建了第二个纸张标记,该标记与同一个气球绑定。
看这个older answer of mine我把气球的比喻推到更多的地方。

07-24 18:35
查看更多