问题
我正在通过以下方式创建一个包含空列表作为值的字典。
>>> 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/