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

问题描述 投票:1回答:2

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

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

我可以这样创建它:

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[:])

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

假设我要创建一个列表列表供以后填充,如下所示:[['',''],['',''],['','']]我可以创建像这样:rows = 3 cols = 2 A = [''] * cols B = [A [:]] * rows但是,...

python python-3.x list copy
2个回答
2
投票
B=[A[:]]*rows

3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.