将值附加到字典中的一个列表 将值附加到字典中的所有列表

Posted

技术标签:

【中文标题】将值附加到字典中的一个列表 将值附加到字典中的所有列表【英文标题】:Append value to one list in dictionary appends value to all lists in dictionary 【发布时间】:2014-06-17 07:24:48 【问题描述】:

问题

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

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

字典是这样的。

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

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

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

问题

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

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

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

【问题讨论】:

这能回答你的问题吗? How do I initialize a dictionary of empty lists in Python? 【参考方案1】:

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

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

关于使用dict.fromkeys(['a', 'b', 'c'], 0)0 是一个 不可变 对象,因此不受该问题的影响,因为对其的更改会导致新对象,而不是对底层对象的更改不同的名称(在这种情况下 - 不同键的值)可以共享。

【讨论】:

以上是关于将值附加到字典中的一个列表 将值附加到字典中的所有列表的主要内容,如果未能解决你的问题,请参考以下文章

将值附加到 Python 字典

为字典中的一个键附加多个值[重复]

如何将值列表附加到数据框中的列表列

无法将字符串附加到字典键

将字典附加到循环中的列表

将值附加到R中的空向量?