gpt4 book ai didi

python - 为什么使用 fromkeys 初始化列表字典会影响列表追加方式

转载 作者:行者123 更新时间:2023-11-30 22:29:50 25 4
gpt4 key购买 nike

使用不同的方法创建列表字典

d1 = {'foo':[],'bar':[]}
d2 = dict.fromkeys(['foo','bar'],[])

产生两个相同的字典。

print(d1==d2,d1,d2)

True {'foo': [], 'bar': []} {'foo': [], 'bar': []}

但是,将值附加到列表

d1['foo'].append('a')
d2['foo'].append('a')

d1['foo'].append(2)
d2['foo'].append(2)

产生两个不同的字典。为什么字典的初始化方法会影响列表追加行为?

print(d1==d2,d1,d2)

False {'foo': ['a', 2], 'bar': []} {'foo': ['a', 2], 'bar': ['a', 2]}

在 fromkeys 之后,python 也将列表追加语句应用于所有其他键。

最佳答案

当您使用fromkeys时,正在创建字典,并且它的所有键都具有与其值相同的对象。

这意味着 d2["foo"]d2["bar"] 引用同一个对象。它是相同对象,而不仅仅是相同对象。因此,通过一个键修改它会改变所有其他键的修改。

如果您使用自定义对象,这会更加明显:

class MyClass:
def __init__(self):
pass

a = MyClass()
d = dict.fromkeys(["foo", "bar"], a)

打印 d 会产生以下输出:

{'foo': <__main__.MyClass object at 0x0000000004699AC8>, 'bar': <__main__.MyClass object at 0x0000000004699AC8>}

注意内存地址是如何相同的,因为它是同一个对象。

但是,在 d1 中,您不会将同一对象分配给两个键。相反,您分配两个单独的相同(空列表)。因此,修改其中一个不会改变另一个。

关于python - 为什么使用 fromkeys 初始化列表字典会影响列表追加方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46251248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com