dict python的奇怪行为

我有一个不符合预期的 dict 代码片段


a = {"d1":{"a":1,"b":2,"c":4},"d2":{"a":1,"b":2,"c":4},"d3":{"a":1,"b":2,"c":4}}

b = {"d1":{"a":1,"b":0},"d2":{"a":0,"c":4},"d3":{"a":1,"b":2,"c":4}}


c = dict.fromkeys(a.keys(),{})

print(c)


for doc in b.keys():

  for word in b[doc].keys():

    c[doc][word] = a[doc][word]*b[doc][word]

print(c)

输出是:


{'d1': {}, 'd2': {}, 'd3': {}}

{'d1': {'a': 1, 'b': 4, 'c': 16}, 'd2': {'a': 1, 'b': 4, 'c': 16}, 'd3': {'a': 1, 'b': 4, 'c': 16}}

代替:


{'d1': {}, 'd2': {}, 'd3': {}}

{'d1': {'a': 1, 'b': 0}, 'd2': {'a': 0, 'c': 16}, 'd3': {'a': 1, 'b': 4, 'c': 16}}

我现在很困惑,任何见解都会有所帮助。


MMMHUHU
浏览 94回答 3
3回答

噜噜哒

问题是因为您使用可变对象作为fromkeys.这在这里更清楚:d = dict.fromkeys(['a', 'b'], [])d['a'].append(1)print(d)输出{'a': [1], 'b': [1]}

潇潇雨雨

使用字典理解来创建c:c = {k: {} for k in a.keys()}for doc in b.keys():  for word in b[doc].keys():    c[doc][word] = a[doc][word]*b[doc][word]print(c)# {'d1': {'a': 1, 'b': 0}, 'd2': {'a': 0, 'c': 16}, 'd3': {'a': 1, 'b': 4, 'c': 16}}请注意使用fromkeysvs 字典理解时的区别:c = dict.fromkeys(a.keys(),{})print([id(o) for o in c.values()])# [53649152, 53649152, 53649152]# same object reference id!c = {k: {} for k in a.keys()}print([id(o) for o in c.values()])# [53710208, 53649104, 14445232]# each object has different reference id

素胚勾勒不出你

for对您的循环进行了修改:for doc in b.keys():  for word in b[doc].keys():    if doc not in c:        c[doc]={}    c[doc][word] = a[doc][word]*b[doc][word]print(c)#{'d1': {'a': 1, 'b': 0}, 'd2': {'a': 0, 'c': 16}, 'd3': {'a': 1, 'b': 4, 'c': 16}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python