【问题标题】:Why does appending to dictionaries created with fromkeys method differ from appending to manually created dictionaries?为什么附加到使用 fromkeys 方法创建的字典与附加到手动创建的字典不同?
【发布时间】:2020-10-25 09:38:11
【问题描述】:

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

dictA = dict.fromkeys(["key1", "key2"], [])
dictB = {
    "key1": [],
    "key2": [],
}

然而,当我将随机值或列表附加到每个字典的特定键时:

dictA["key2"].append(1)
dictB["key2"].append(1)

...我最终得到不同的结果:

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

这是为什么呢?

【问题讨论】:

  • 在第一种情况下,每个值都是对同一个数组的引用。
  • 有一种简单的方法可以制作具有唯一列表作为值的字典:{key:list() for key in ('key1', 'key2')}

标签: python dictionary append


【解决方案1】:

这是因为dict.fromkeys() 的默认值在可变时指向单个对象。您可以这样进行测试:

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

print(id(d['a']))
print(id(d['b']))
Out[115]: 2315628170504
Out[116]: 2315628170504

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

【讨论】:

  • 这是预期的行为吗?真的有这个用例吗?
  • 这是预期的。原因比较复杂,这里有一些introductory reading
  • @MichelF。这在 python 中是非常一致的。习惯它。多个变量/键/等可以并且将引用完全相同的对象。
  • @MichelF。这是预期的行为。文档字符串说 ...并且值设置为 value.。当您想要整数 0 或默认字符串时,这是有意义的。您正在使用可变容器,但问题是,如何复制对象以使值唯一是模棱两可的。一个列表,好吧,...但是应该深拷贝所有包含的对象吗?那么泛型类Foo 呢?然后怎样呢?由于复制没有一个好的通用选择,所以最好的选择是不要在诸如列表之类的基础对象中实现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多