Python:为什么这个列表列表包含引用而不是副本?

Python: Why does this list of lists contains references instead of copies?

本问题已经有最佳答案,请猛点这里访问。

我有以下的python2程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
A=[]
for i in range(2):
    A.append(list(["hello"]))
print"A is",A

F=[]
for i in range(2):
    F.append(list(A))

print"F[0] is", F[0]
print"F[1] is", F[1]

F[0][0].append("goodbye")

print"F[0][0] is", F[0][0]
print"F[1][0] is", F[1][0]

当我运行它时,我得到输出:

1
2
3
4
5
A is [['hello'], ['hello']]
F[0] is [['hello'], ['hello']]
F[1] is [['hello'], ['hello']]
F[0][0] is ['hello', 'goodbye']
F[1][0] is ['hello', 'goodbye']

我原以为F[1][0]的内容只是['hello']。我想如果我写的话,程序的当前行为将是正常的。用F.append(A)代替F.append(list(A))。但是,通过写list(A)而不是仅仅写A,我应该通过值而不是引用来传递清单A

我在这里误解了什么?

编辑:如果我写F.append(A[:])而不是F.append(list(A)),程序具有相同的行为。


列表(A)和[:]对可变对象集合有限制,因为内部对象保持其引用不变。在这种情况下,您应该使用deepcopy

特别是,应该是F.append(copy.deepcopy(A)),而不是F.append(list(A))