python使用{}.fromkeys创建字典后,通过append更新list型value出错?

发布于 2022-09-01 18:03:47 字数 785 浏览 15 评论 0

直接上代码:
header= {'a', 'c', 'b', 'e', 'f'}
然后根据该序列初始化字典dic1,并设置其值默认格式为list:
dic1={}.fromkeys(header,[])
print dic1
输出:{'a': [], 'c': [], 'b': [], 'e': [], 'f': []}
一切都是对的:

然后为key为'a'的键更新value:
dic1['a'].append(1)
print dic1
可输出竟然是:
{'a': [1], 'c': [1], 'b': [1], 'e': [1], 'f': [1]}

按道理应该是
{'a': [1], 'c': [], 'b': [], 'e': [], 'f': []}

可是换一种方式:
直接定义字典的话:
dic2={'a': [], 'c': [], 'b': [], 'e': [], 'f': []}
dic2['a'].append(1)
print dic2
输出则是正常的
{'a': [1], 'c': [], 'b': [], 'e': [], 'f': []}
在pydev中对比,两个变量是一模一样的:
图片描述

这是为什么呢,求大神支招。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

橘寄 2022-09-08 18:03:47

楼上的解决方案是对的,不过Python2.7及以上版本才支持这么写,如果你的版本不支持,用这个:

>>> dic1 = dict([(k, []) for k in header])
>>> dic1
{'a': [], 'c': [], 'b': [], 'e': [], 'f': []}
>>> map(id, dic1.values())
[38590424, 38590024, 38591464, 38757120, 31261600]
(り薆情海 2022-09-08 18:03:47

原因是第一种情况的列表都是一个对象,第二种则都是不同的对象。他们的key的变量地址都是相同

In [1]: header= {'a', 'c', 'b', 'e', 'f'}

In [2]: dic1={}.fromkeys(header,[])

In [3]: dic1
Out[3]: {'a': [], 'b': [], 'c': [], 'e': [], 'f': []}

In [4]: dic1['a'] is dic1['b']
Out[4]: True

In [5]: dic2={'a': [], 'c': [], 'b': [], 'e': [], 'f': []}

In [6]: dic2['a'] is dic2['b']
Out[6]: False

In [8]: dic1.keys()
Out[8]: ['a', 'c', 'b', 'e', 'f']

In [9]: dic1.keys()[0] is dic2.keys()[0]
Out[9]: True
初与友歌 2022-09-08 18:03:47

Python 中 list 是可变类型,在作为参数传递的时候是传引用的。

所以 fromkeys 函数把所有 key 都指向了同一个空列表。改动其中任何一个,其他的都改掉了。

夜声 2022-09-08 18:03:47

前面都给的分析, 我上个代码:

dic1 = {k:[] for k in header}  # fromkeys改成这个

改动这一行就行了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文