通过意外地将列表相乘来创建列表列表,将使内部列表保持连接状态

时间:2019-10-29 12:22:29

标签: python python-3.x list copy

比方说,我想创建一个列表列表供以后填充,如下所示:

[['', ''], ['', ''], ['', '']]

我可以这样创建它:

rows=3
cols=2

A=['']*cols
B=[A[:]]*rows

但是,内部列表是同一对象,可以看出:

B[0][0]='!'
print (B)

输出:

[['!', ''], ['!', ''], ['!', '']]

即使我使用B=[A[:]]*rows而不是B=[A]*rows,也会发生这种情况;使用B=[A][:]*rows不能解决问题。

如果A[:]应该通过切片A有效地创建完整副本(而不只是参考),那么为什么会发生这种情况?

P.S。

显然,这可以通过以下方式轻松解决:

this_text=[]
temp=[]
for i in range(cols):
    A.append('')
for i in range(rows):
    B.append(A[:])

我的目标是增进了解,而不是创建列表的特定列表。

2 个答案:

答案 0 :(得分:3)

这将防止B成为副本列表,因为它会为每个A[:]创建一个新的x

B=[A[:] for x in range(rows)]

答案 1 :(得分:2)

B=[A[:]]*rows

进行相同 list个实例['' * cols] 次。

更改一个引用到该实例将影响所有引用。

使用理解来创建独立列表。

B=[A[:] for x in range(rows)]