gpt4 book ai didi

python - 从具有不同键但相同 ID 的现有字典创建新的 Python 字典

转载 作者:太空宇宙 更新时间:2023-11-04 01:03:13 24 4
gpt4 key购买 nike

我有一个复合字典 d,它由一组组件字典 d1d2 构建而成:

d1 = {'key1': 4}
d2 = {'key2': 5}
d = {}
d['altname_key1'] = d1['key1']
d['altname_key2'] = d2['key2']

我试图完成的行为是让 d 的键更改自动传播到 d1d2 中的更改。上面的代码不是这样的,可以通过比较id来验证:

id(d['altname_key1']) == id(d1['key1'])
True
id(d['altname_key2']) == id(d2['key2'])
True
d['altname_key1'] = 17
id(d['altname_key1']) == id(d1['key1'])
False

如果我的复合字典只是单个组件的组合并且如果我没有更改键名,那么我正在寻找的行为就可以实现:

d = d1
d['key1'] = 45
id(d['key1']) == id(d1['key1'])
True

python 是否具有启用复合字典 d 的功能,包括不同的键名,这样键指向内存中的同一点,即使键具有不同的名称?

最佳答案

我相信其他原因可能导致值的 id 发生变化,也许您在测试 id 之前对 d 字典做了一些其他分配> ,python 中的数字是不可变的,因此两个不同的数字不会有相同的 id

当你这样做时 - d['altname_key1'] = d1['a'] - Python 通过赋值传递,这意味着 d1['a'] 的引用code> 的引用是按值传递的。示例 -

>>> d = {'a':[1,2]}
>>> d2 = {'b':[3,4]}
>>> d3 = {}
>>> d3 ['aa'] = d['a']
>>> d3['bb'] = d2['b']
>>> d3
{'bb': [3, 4], 'aa': [1, 2]}

>>> id(d3['aa']) == id(d['a'])
True
>>> d3['aa'].append(5)

>>> d3
{'bb': [3, 4], 'aa': [1, 2, 5]}

>>> d
{'a': [1, 2, 5]}

所以您尝试实现的目标确实有效。


但是鉴于此,我想建议不要对同一个可变对象保留多个引用,因为这种方法会导致神秘的错误,一些代码可能会错误地更新 d 字典,即使你不想它会导致相同的更改反射(reflect)在 d1 中。而且很难调试这些问题。

此外,如果您对 d 进行赋值,此方法会中断,在这种情况下,d 字典的值会改变,但 d1d2 不会改变。示例 -

>>> d3['aa'] = [1]
>>> d3
{'bb': [3, 4], 'aa': [1]}
>>> d
{'a': [1, 2, 5]}

您可能需要重新考虑您尝试设计的内容。


关于为什么在执行以下操作时会得到所需的行为 -

d = d1
d['key1'] = 45
id(d['key1']) == id(d1['key1'])
True

是因为d中是对d1字典对象的引用,所以它们基本上指向同一个字典。因此 d['key1'] 将始终是 d1['key1'] 。您可以执行以下操作以查看它们是相同的引用 -

id(d) == id(d1)

由于上述原因,再次不推荐。

关于python - 从具有不同键但相同 ID 的现有字典创建新的 Python 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31910589/

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