Python 为什么附加到使用fromkeys方法创建的词典与附加到手动创建的词典不同?

Python 为什么附加到使用fromkeys方法创建的词典与附加到手动创建的词典不同?,python,dictionary,append,Python,Dictionary,Append,我使用两种不同的方法创建了两个相同的字典,其中包含列表: dictA = dict.fromkeys(["key1", "key2"], []) dictB = { "key1": [], "key2": [], } 然而,当我将随机值或列表附加到每个字典的特定键时: dictA["key2"].append(1) dictB["key2"].append(1

我使用两种不同的方法创建了两个相同的字典,其中包含列表:

dictA = dict.fromkeys(["key1", "key2"], [])
dictB = {
    "key1": [],
    "key2": [],
}
然而,当我将随机值或列表附加到每个字典的特定键时:

dictA["key2"].append(1)
dictB["key2"].append(1)
…我最终得到了不同的结果:

{'key1': [1], 'key2': [1]}
{'key1': [], 'key2': [1]}

这是为什么?

这是因为当可更改时,
dict.fromkeys()的默认值指向单个对象。您可以这样做测试:

d = {}.fromkeys(['a', 'b'], [])

print(id(d['a']))
print(id(d['b']))

'a'
'b'
的值指向同一个对象。

在第一种情况下,每个值都是对同一数组的引用。有一种简单的方法可以创建具有唯一列表作为值的字典:
{key:list()for key-In('key1',key2')}
这是预期的行为吗?真的有这样的用例吗?这是意料之中的。原因很复杂,这里有一些。@MichelF。这在python中是非常一致的。习惯它。多个变量/键/etc可以并将引用完全相同的对象。@MichelF。这是预期的行为。文档字符串显示…并将值设置为value。。例如,当您需要整数0或默认字符串时,它是有意义的。您使用的是可变容器,但问题是,如何复制对象以使值唯一是不明确的。一份清单,好的。。。但是,深度复制是否应该复制所有包含的对象?那么泛型类
Foo
呢。然后呢?由于没有一个很好的通用选择来复制,最好的选择不是在一个基础对象如列表中实现它。
Out[115]: 2315628170504
Out[116]: 2315628170504