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