gpt4 book ai didi

python - 为什么使用 dict.fromkeys() 和大括号为字典初始化赋值时会有差异?

转载 作者:太空宇宙 更新时间:2023-11-03 15:28:46 25 4
gpt4 key购买 nike

这是一个例子,

my_keys=['hi','hello']
d=dict.fromkeys(my_keys,[])
print d
d['hello'].append([1,])
print d['hello']
print d['hi']

d={'hi': [], 'hello': []}
print d
d['hello'].append([1,])
print d['hello']
print d['hi']

输出:

{'hi': [], 'hello': []}
[[1]]
[[1]]
{'hi': [], 'hello': []}
[[1]]
[]

通过输出可以看出,当修改一个key的值时,即d['hello'].append([1,])如果字典初始化为dict.fromkeys(),则更改键“hi”的值

classmethod <strong>fromkeys</strong>(<em>seq</em>[, <em>value</em>])
create a new dictionary with keys from seq and values set to value.

为什么给用 dict.fromkeys() 初始化的字典赋值时会有差异并带有大括号?

最佳答案

dict.fromkeys() 不会复制您传入的值,因此您只有一个列表对象。您的 {...} 字典文字创建两个单独的列表

请记住,在 Python 中,列表或字典等容器中包含的名称、属性和对象只是对堆上对象的引用。您可以轻松创建对同一对象的多个引用。 dict.fromkeys() 仅获取您传入的引用并将其重新用于所有值。因此 d 中的所有值都指向同一个列表对象:

>>> my_keys = ['hi', 'hello']
>>> d = dict.fromkeys(my_keys)
>>> d['hi'] is d['hello']
True
>>> id(d['hi']), id(d['hello'])
(4508307448, 4508307448)

使用字典理解从键列表创建字典,您需要在其中为值生成单独的对象:

{k: [] for k in my_keys}

在字典理解中,for循环的每次迭代都会评估值表达式,因此[]表达式会一次又一次地执行以生成单独的列表对象:

>>> d = {k: [] for k in my_keys}
>>> d['hi'] is d['hello']
False
>>> id(d['hi']), id(d['hello'])
(4514233544, 4514233672)

关于python - 为什么使用 dict.fromkeys() 和大括号为字典初始化赋值时会有差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43027508/

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