繁体   English   中英

奇怪的python dict行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM