在字典中向一个列表添加值会将该值添加到字典中所有列表中。

16

问题

我正在创建一个字典,其中值为空列表,方式如下。

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

这本字典长成这样。

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

当我向一个列表中添加一个值时,像这个例子一样,该值会被附加到所有的列表中。

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

问题

我的问题有两个部分。第一,为什么会发生这种情况?第二,我该怎么做才能解决它?也就是说,怎样才能向仅一个列表附加值?

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

我会感激任何意见。提前谢谢您!


1
这个回答解决了你的问题吗?如何在Python中初始化一个空列表字典? - Georgy
1个回答

25
dict.fromkeys方法使用相同的对象作为所有值,即使用一个可变列表... 这意味着,所有键都共享相同的空列表... 当您尝试对一个列表的值进行.append操作时,更改会直接在该对象中就地进行,因此对它所做的更改将被所有引用它的人看到。
如果您使用字典推导式, 例如:{k:[] for k in ['could', 'we', 'be']},每个[]都是一个不同的空列表,因此对于每个键值都是唯一的,并且按预期工作。
关于使用dict.fromkeys(['a', 'b', 'c'], 0)0是一个不可变对象,因此不受这种问题的影响,因为对它的更改会产生新的对象,而不是更改底层对象,可能会共享不同名称(在这种情况下,是不同键的值)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接