我有一个词典,我已经添加了10个空词的列表值。 然后我尝试将单个值添加到列表中的一个dicts。 但似乎我将它设置为列表中的所有dicts。 有任何想法吗?我怎么能实现它这个不能工作呢?
bids={}
bids[1]=[{}]*10
bids[1][0][1]=0
出价打印为
{1: [{1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}]}
虽然我期待:
{1: [{}, {1: 0}, {}, {}, {}, {}, {}, {}, {}, {}]}
答案 0 :(得分:6)
[{}]*10
将创建一个列表,其中包含对相同字典对象的10个引用。通过操纵这一个实例,这些更改显然会影响整个列表。
改为使用[{} for _ in range(10)]
。
答案 1 :(得分:4)
[{}]*10
创建一个空字典,然后创建一个包含10个元素的列表,所有这些元素都是该字典。在代码中,它等同于:
d = {}
[d, d, d, d, d, d, d, d, d, d]
您需要一个包含10个不同词典的列表,这些词典最初都是空的。在代码中,您将其编写为:
[{}, {}, {}, {}, {}, {}, {}, {}, {}, {}]
[{} for _ in range(10)]
答案 2 :(得分:0)
一种不同的方法是,您可能希望或能够使每个值成为dicts的字典,而不是您计划使用它们的其他内容:
from collections import defaultdict
bids={}
bids[1]=defaultdict(dict)
bids[1][0][1]=0
print bids
# {1: defaultdict(<type 'dict'>, {0: {1: 0}})}
每次引用一个值时,每个值都会自动初始化为一个单独的空字典。字典不像列表那样保留顺序,但这是你不需要的东西。即使是这样,您也可以根据需要通过按键对它们进行排序。