如何使用理解语法创建包含N个列表的列表,每个列表包含N个不同的词典?

时间:2018-02-13 16:49:18

标签: python python-3.x

    oneCounts = [[{'l':0,'r':0,'t':0,'b':0}] * N for i in range(0,N)]     
    oneCounts[0][1]['t'] = 3

在上面的代码设置中,特定字典上的键值会导致同一列表中的所有字典都将其t键值设置为相同的值。这对我来说意外。我错过了什么?

2 个答案:

答案 0 :(得分:0)

将第一行更改为

oneCounts = [[{'l':0,'r':0,'t':0,'b':0} for _ in range(N)] for i in range(0, N)] 
# oneCounts = [[{'l':0,'r':0,'t':0,'b':0} for _ in range(N)] for _ in range(N)] 

以创建独立词典。

[x] * n创建了对相同对象x的n个引用列表。当x是不可变类型时,您应该只使用该语法,例如int

答案 1 :(得分:0)

意外结果背后的原因是你只调用一次构造函数然后再使用同一个对象N次。因此,实际上,您将相同的对象N次附加到 oneCounts ,因为包含字典的列表具有相同的引用。

尝试以下内容:

oneCounts = []
for i in range(N):
    oneCounts.append([{'l':0,'r':0,'t':0,'b':0} for j in range(N)])

此处, oneCounts 是一个包含N个列表的列表,每个列表包含N个单独的词典。

编辑:我刚注意到用户' schwobaseggl'给出了答案。它与我的代码完全相同,但输入较少。我个人更喜欢这个答案。