创建彼此独立的Python变量

Laz*_*h13 3 python list

如果我有这个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)

这肯定意味着当我追加9bar,它也会受到影响foo.如何使变量bar等于foo,但是当我编辑时bar,它不起作用foo

Mar*_*ers 5

您正在更改可变值,因此您需要制作一个显式副本:

bar = list(foo)
Run Code Online (Sandbox Code Playgroud)

要么

bar = foo[:]
Run Code Online (Sandbox Code Playgroud)

在Python中分配名称时,您所做的只是存储对值的引用.如果没有创建列表,两者的副本foo,并bar提到了相同的列表.

对于非可变值,这不是问题; 您可以将对字符串的引用替换为指向不同的值.

但是列表(以及dictset大多数类的实例)是可变的.你没有改变foo,你改变了foo.你做了foo.append(9),Python认为:

  • 找到值foo指的是.
  • 找到该.append值的属性.这将返回列表实例上的方法.
  • 调用方法,传入值9.这改变了清单.

Python名称本身只不过是标签,指向实际值.您可以将值视为气球,将名称视为小纸标签,分配是将标签绑定到气球的行为.bar = foo创建了第二个纸质标签,它与完全相同的气球相关联.

看到我的这个较旧的答案,我将气球比喻推到了更远处.