如果我有这个Python代码:
foo = [3, 5, 9]
bar = foo
bar.append(9)
print(foo)
Run Code Online (Sandbox Code Playgroud)
它回来了
[3, 5, 9, 9]
Run Code Online (Sandbox Code Playgroud)
这肯定意味着当我追加9时bar,它也会受到影响foo.如何使变量bar等于foo,但是当我编辑时bar,它不起作用foo?
您正在更改可变值,因此您需要制作一个显式副本:
bar = list(foo)
Run Code Online (Sandbox Code Playgroud)
要么
bar = foo[:]
Run Code Online (Sandbox Code Playgroud)
在Python中分配名称时,您所做的只是存储对值的引用.如果没有创建列表,两者的副本foo,并bar提到了相同的列表.
对于非可变值,这不是问题; 您可以将对字符串的引用替换为指向不同的值.
但是列表(以及dict和set大多数类的实例)是可变的.你没有改变foo,你改变了指的值foo.你做了foo.append(9),Python认为:
foo指的是..append值的属性.这将返回列表实例上的方法.9.这改变了清单.Python名称本身只不过是标签,指向实际值.您可以将值视为气球,将名称视为小纸标签,分配是将标签绑定到气球的行为.bar = foo创建了第二个纸质标签,它与完全相同的气球相关联.
看到我的这个较旧的答案,我将气球比喻推到了更远处.