问题
我正在以下列方式创建一个以空列表作为值的字典。
>>> words = dict.fromkeys(['coach', 'we', 'be'], [])
字典看起来像这样。
>>> words
{'coach': [], 'be': [], 'we': []}
当我将值附加到一个列表时,该值会附加到所有列表中,如本例所示。
>>> words['coach'].append('test')
{'coach': ['test'], 'be': ['test'], 'we': ['test']}
问题
我的问题有两个部分。首先,为什么会发生这种情况?其次,我能做些什么呢?也就是说,如何只将值附加到一个列表中?
我想在创建字典时,我将所有列表指向同一个对象。但我不明白这是怎么回事,因为当我在字典创建中输入0
而不是[]
然后添加值而不是追加它们时,这些值的行为就像它们指向不同的对象一样。
我很感激任何意见。提前谢谢!
答案 0 :(得分:21)
dict.fromkeys
对所有值使用相同对象,在本例中为mutable
列表...这意味着,所有键共享相同的空列表< / em> ...当您尝试.append
到一个列表的值时,对对象进行了就地更改,因此引用它的所有人都可以看到对它的更改。
如果您使用了dict-comp,例如:{k:[] for k in ['could', 'we', 'be']}
每个[]
都是不同的空列表,因此每个键值都是唯一的,并按预期工作
关于使用dict.fromkeys(['a', 'b', 'c'], 0)
,0
是一个不可变的对象,因此不会因为对它的更改而产生新的对象,而不是更改为基础对象,不同的名称(在这种情况下 - 不同键的值)可以共享。