比方说,我想创建一个列表列表供以后填充,如下所示:
[['', ''], ['', ''], ['', '']]
我可以这样创建它:
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[:])
我的目标是增进了解,而不是创建列表的特定列表。
答案 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)]