为了账号安全,请及时绑定邮箱和手机立即绑定

dict python的奇怪行为

dict python的奇怪行为

MMMHUHU 2022-06-02 16:43:01
我有一个不符合预期的 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}}我现在很困惑,任何见解都会有所帮助。
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

问题是因为您使用可变对象作为fromkeys.


这在这里更清楚:


d = dict.fromkeys(['a', 'b'], [])

d['a'].append(1)

print(d)

输出


{'a': [1], 'b': [1]}


查看完整回答
反对 回复 2022-06-02
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

使用字典理解来创建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


查看完整回答
反对 回复 2022-06-02
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

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}}


查看完整回答
反对 回复 2022-06-02
  • 3 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号