创建一个列表的列表,意外地通过乘法生成内部列表之间保持连接。

2024-03-29 08:00:59 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我想创建一个列表列表,稍后再填充,如下所示:

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

我可以这样创造:

rows=3
cols=2

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

但是,内部列表是相同的对象,如图所示:

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

输出:

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

即使我使用了B=[A[:]]*rows而不是B=[A]*rows,也会出现这种情况;使用B=[A][:]*rows并不能解决问题。你知道吗

如果A[:]应该通过切片有效地创建完整副本(而不仅仅是引用),那么为什么会发生这种情况?你知道吗

附言

显然,这可以很容易地解决,例如:

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

我的目的是增进理解,而不是创建这个具体的列表。你知道吗


Tags: 对象in列表for副本情况切片range
2条回答

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

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

相同的list实例['' * cols]次。你知道吗

更改对所述实例的一个引用将影响所有引用。你知道吗

使用理解来创建独立的列表。你知道吗

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

相关问题 更多 >