[英]Strange python dict behavior
有人可以为我解释这种行为吗?
mapping = dict.fromkeys([1, 2, 3], [])
objects = [{'pk': 1}, {'pk': 2}, {'pk': 3}]
for obj in objects:
pk = obj['pk']
mapping[pk].append(obj)
print mapping
# expected: {1: [{'pk': 1}], 2: [{'pk': 2}], 3: [{'pk': 3}]}
# got: {1: [{'pk': 1}, {'pk': 2}, {'pk': 3}], 2: [{'pk': 1}, {'pk': 2}, {'pk': 3}], 3: [{'pk': 1}, {'pk': 2}, {'pk': 3}]}
我试图将objects
的dicts映射到另一个dict,其键是原始字典的属性。 假设objects
列表包含每个唯一PK的几个对象(我不仅仅是在这里使用map
的原因)。
那是因为:
mapping = dict.fromkeys([1, 2, 3], [])
[]
被评估一次,因此每个键与值具有相同的列表。 请尝试使用collections.defaultdict
。
如果您更改mapping
如下:
from collections import defaultdict
mapping = defaultdict(list)
并按原样保留其余部分,代码将按预期执行。
您当前代码的问题是mapping
所有三个键都mapping
到同一个列表。 将元素追加到一个元素时,您实际上是将它附加到所有元素。
它发生了,因为在这一行:
mapping = dict.fromkeys([1, 2, 3], [])
您为每个键分配相同的列表。 并且因为列表是可变的,通过修改一个键的列表,您可以同时修改其他键的列表。
在第1行,使用表达式[]会导致创建一个空列表。
这是上面代码段中出现的唯一空列表对象。 当dict.fromkeys运行时,它不会为空列表创建三个不同的副本。 相反,它对SAME空列表进行了三次引用。
因此,在稍后的循环中,每次在空列表中添加另一个数字时,它都是相同的列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.