首页  >  文章  >  后端开发  >  为什么具有可变值的“dict.fromkeys”会创建共享对象?

为什么具有可变值的“dict.fromkeys”会创建共享对象?

Susan Sarandon
Susan Sarandon原创
2024-10-26 03:16:27142浏览

Why Does `dict.fromkeys` With Mutable Values Create Shared Objects?

使用 fromkeys 创建可变对象和字典

使用 dict.fromkeys 创建具有可变对象(例如列表)的字典时观察到的行为,一开始可能会令人惊讶。以下示例演示了该问题:

<code class="python">xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)  # Outputs: {0: [1], 1: [1]}</code>

在本例中,我们创建一个包含两个键(0 和 1)的字典,每个值都有一个空列表。但是,当我们将一个元素追加到与键 0 关联的列表时,它也会出现在与键 1 关联的列表中。

要理解此行为,请务必注意 dict.fromkeys 共享相同的值对象所有键之间。在我们的示例中,xs[0] 和 xs[1] 都指向同一个列表对象,如下所示:

<code class="python">print(xs[0] is xs[1])  # Outputs: True</code>

因此,通过 xs[0] 对列表所做的任何修改也会反映出来在 xs[1] 中,因为它们引用相同的底层对象。

相反,使用字典理解创建包含可变对象的字典会导致每个值都是一个单独的对象:

<code class="python">xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)  # Outputs: {0: [1], 1: []}</code>

在这种情况下,xs[0]和xs[1]不是同一个对象,因此修改xs[0]不会影响xs[1]。

在Python 2.6或更早版本中,当字典推导式不可用,您可以使用带有 dict() 的生成器表达式来实现与字典理解相同的行为:

<code class="python">xs = dict((i, []) for i in range(2))</code>

以上是为什么具有可变值的“dict.fromkeys”会创建共享对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn