奇怪的python dict行为

Aar*_*ron 3 python dictionary

有人可以为我解释这种行为吗?

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}]}
Run Code Online (Sandbox Code Playgroud)

我试图将dicts映射objects到另一个dict,其键是原始字典的属性.假设objects列表包含每个唯一PK的几个对象(我不仅仅map在这里使用的原因).

sou*_*eck 5

那是因为:

  mapping = dict.fromkeys([1, 2, 3], [])
Run Code Online (Sandbox Code Playgroud)

[]被评估一次,因此每个键具有与值相同的列表.请尝试使用collections.defaultdict.