python - 在 Python 中将列表元素附加到字典时出错
问题描述
尝试将元素列表附加到字典时,我遇到了一个奇怪的问题。我不确定我做错了什么。很感谢任何形式的帮助。
这是我所拥有的:
keys = ['a', 'b', 'c']
d = dict.fromkeys(keys, [])
d['a'].append(10)
d['a'].append(11)
d['b'].append(30)
print(d)
我得到的输出是:
{'a': [10, 11, 30], 'b': [10, 11, 30], 'c': [10, 11, 30]}
我希望:
{'a': [10, 11], 'b': [30], 'c': None}
谢谢
解决方案
您正在提供一个空列表,并将fromkeys()
此特定对象用于所有键,以便它们的对应值引用同一对象。当您这样做时d['a'].append(10)
,它会附加10
到所有 dict 项共享的单个对象,从而产生您现在得到的结果。
Python 文档提到了这种确切的情况:
fromkeys() 是一个返回新字典的类方法。值默认为无。所有的值都只引用一个实例,因此 value 通常是一个可变对象(例如空列表)是没有意义的。要获得不同的值,请改用 dict 理解。
— https://docs.python.org/3/library/stdtypes.html#mapping-types-dict
按照 python 文档中的建议,您可以这样做d = {k: [] for k in keys}
。
推荐阅读
- java - Tomcat 8 在方法名称中发现无效字符。HTTP 方法名称必须是标记
- angular - 带有特殊字符的 angular-l10n 奇怪的翻译
- php - 如何在 laravel 中使用附加方法使用关系
- swagger - Swagger YAML 规范,有条件的必填字段
- python - 如何在 Python 中动态引用变量?
- javascript - 电子:总是返回 ontouchstart = true
- angularjs - 如何在 angular.forEach 中动态添加 ng-model
- android-manifest - 合并的 AndroidManifest.xml 文件中的问题
- c++ - C ++中的命令处理器与控制台
- python - Python / Celery:杀死父任务时如何杀死子任务?