python - 将值 append 到字典中的一个列表将值 append 到字典中的所有列表

标签 python list object dictionary append

问题

我正在通过以下方式创建一个包含空列表作为值的字典。

>>> words = dict.fromkeys(['coach', 'we', 'be'], [])

字典看起来像这样。

>>> words
{'coach': [], 'be': [], 'we': []}

当我将一个值 append 到一个列表时,该值将 append 到所有列表,如本例所示。

>>> words['coach'].append('test')
{'coach': ['test'], 'be': ['test'], 'we': ['test']}

问题

我的问题分为两部分。首先,为什么会这样?其次,我能做些什么呢?也就是说,我如何才能将值 append 到一个列表?

我想象在创建字典时,我让所有列表都指向同一个对象。但我不明白这是怎么回事,因为当我在字典创建中输入 0 而不是 [] 然后添加值而不是 append 它们时,这些值的行为不同如果它们指向不同的对象。

如有任何意见,我将不胜感激。提前致谢!

最佳答案

dict.fromkeys 对所有值使用相同的对象,在本例中是一个mutable 列表...这意味着所有键共享相同的空列表...当您尝试.append 到一个列表的值时,更改是就地对对象进行的,因此对它的更改是所有引用它的人都可见。

如果您改为使用 dict-comp,例如:{k:[] for k in ['could', 'we', 'be']} 每个 [] 是一个不同的空列表,因此每个键值都是唯一的,并且按预期工作。

关于使用 dict.fromkeys(['a', 'b', 'c'], 0) 0 是一个不可变 对象因此不受该陷阱的影响,因为对它的更改会导致新对象,而不是对不同名称(在本例中为不同键的值)可能共享的底层对象的更改。

关于python - 将值 append 到字典中的一个列表将值 append 到字典中的所有列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23397153/

相关文章:

python - 在文件开头写()?

java - 如何使用选定的对象维护 Wicket 中的第二个项目列表 'ListMultipleChoice'

javascript - setInterval 的替代方案,可以实时更改

Javascript `this` 与 Python `self` 构造函数

python - 如何将算法转换为python

python - 筛选干草堆结果

python - 设置.py & pip : override one of the dependency's sub-dependency from requirements. txt

delphi - 向 TList 和 TStringList 添加稳定排序的简单方法

python - 遍历数组查看多个值

java - 在Java中将一个对象分配给另一个对象