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

Gya*_*eda 11 python dictionary list append object

问题

我正在以下列方式创建一个带有空列表的字典作为值.

>>> words = dict.fromkeys(['coach', 'we', 'be'], [])
Run Code Online (Sandbox Code Playgroud)

字典看起来像这样.

>>> words
{'coach': [], 'be': [], 'we': []}
Run Code Online (Sandbox Code Playgroud)

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

>>> words['coach'].append('test')
{'coach': ['test'], 'be': ['test'], 'we': ['test']}
Run Code Online (Sandbox Code Playgroud)

问题

我的问题有两个部分.首先,为什么会发生这种情况?其次,我能做些什么呢?也就是说,如何只将值附加到一个列表中?

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

我很感激任何意见.先感谢您!

Jon*_*nts 21

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

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

在问候使用dict.fromkeys(['a', 'b', 'c'], 0)0是一个不可变的对象从而不受该疑难杂症的改变它产生新的对象,而不是改变到基础物体不同的名称(在此情况下-的不同键的值)可以共享.