更改原始对象时更改的对象列表

时间:2017-06-02 13:41:49

标签: python

在Python中,如果我写:

a = [1]
b = 3 * [a]
a.append(2)
print a, b

然后,输出是:

[1, 2] [[1, 2], [1, 2], [1, 2]]

然而,当我写:

a = [1]
b = 3 * a # notice the missing brackets here 
a.append(2)
print a, b

原来是:

[1, 2] [1, 1, 1]

这里发生了什么?

2 个答案:

答案 0 :(得分:3)

在第一个例子中,想一想Python对这个语句的作用:

b = 3 * [a]

变成:

b = [[a], [a], [a]]

因此,更改a将反映在b中,因为ba个对象组成。

但是,在第二个示例中,您执行此操作:

b = 3 * a

这会创建列表a的副本,相当于:

b = [1, 1, 1]

因此,这次追加a时,一切都没有改变。

答案 1 :(得分:1)

这是因为当您执行b = 3 * [a]时,对变量a的引用不会丢失。因此,a中所做的任何更改都将在b。

中复制

但是,当您运行b = 3 * a时,正在创建一个新的list实例,该实例不再引用a列表。

Python中的所有数据结构都是对象,变量指向它们。 :)