将项添加到python中的词典内的列表时出现奇怪的行为

时间:2014-10-28 07:44:19

标签: python list python-2.7 dictionary append

我有一个由201个整数键(0..200)索引的字典。每个键的值都是一个列表。使用以下代码生成:

dictionary=dict.fromkeys(range201,[])

当我尝试将项目附加到属于一个特定索引的列表时,我得到这种奇怪的行为,如果我这样做:

dictionary[1].append("foo")

我希望如此:

>>dictionary
{0:[], 1:["foo"],2:[],...}

但我最终得到了这个:

>>dictionary
{0:["foo"], 1:["foo"],2:["foo"],...}

为了澄清执行操作的上下文,我列举了可以是Nonefloat的值列表,我想跳过None并追加与枚举索引对应的列表的float

for i, value in enumerate(valuesList):
    if value is None:
        continue
    dictionary[i].append(value)

这是行为与我使用的整数索引无关,并且我在所有索引处都得到相同的值。我可以使用列表列表并实现我认为的相同结果。但我想了解这种行为。

1 个答案:

答案 0 :(得分:1)

这是正常行为。您的词典的所有条目都在初始化时引用了相同的列表。因此,当使用一个键附加元素时,由于所有键都指向相同的列表,因此修改将应用于dic的所有条目。

请改为尝试:

dictionary={}
for i in range(201):
    #the loop make the list.__init__() (i.e. the []) being called 200 times
    dictionary[i] = []

dictionary[1].append("foo")
print dictionary