在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]
这里发生了什么?
答案 0 :(得分:3)
在第一个例子中,想一想Python对这个语句的作用:
b = 3 * [a]
变成:
b = [[a], [a], [a]]
因此,更改a
将反映在b
中,因为b
由a
个对象组成。
但是,在第二个示例中,您执行此操作:
b = 3 * a
这会创建列表a
的副本,相当于:
b = [1, 1, 1]
因此,这次追加a
时,一切都没有改变。
答案 1 :(得分:1)
这是因为当您执行b = 3 * [a]
时,对变量a
的引用不会丢失。因此,a中所做的任何更改都将在b。
但是,当您运行b = 3 * a
时,正在创建一个新的list
实例,该实例不再引用a
列表。
Python中的所有数据结构都是对象,变量指向它们。 :)