gpt4 book ai didi

Python 空字典没有通过引用传递?

转载 作者:太空宇宙 更新时间:2023-11-04 08:10:06 25 4
gpt4 key购买 nike

这个示例代码有点奇怪,但请耐心等待...

class Foo(object):
def __init__(self, internal_dict = None):
self._internal_dict = internal_dict or {}

for attribute_name in self.__class__.__dict__.keys():
attr = getattr(self.__class__, attribute_name)
if isinstance(attr, str) and attribute_name.startswith("a"):
# We are iterating over all string attributes of this class whos name begins with "a"
self._internal_dict[attribute_name] = {}
setattr(self, attribute_name + '_nested_object', Foo(internal_dict=self._internal_dict[attribute_name]))

class FooChild(Foo):
ax = "5"
ay = "10"

fc = FooChild()

print fc.ax_nested_object._internal_dict # This prints {}

fc.ax_nested_object._internal_dict['123'] = 'abc'

print fc._internal_dict # This prints {'ay': {}, 'ax': {}}

我本以为我的 {'123' = 'abc'} 已经完成了第二次打印,因为字典应该已经传递到递归 __init__通过引用调用。但是,如果我更改此行:

self._internal_dict[attribute_name] = {}

为此:

self._internal_dict[attribute_name] = {'test': 1}

然后我得到以下打印:

{'test': 1}
{'ay': {'test': 1}, 'ax': {'test': 1, '123': 'abc'}}

为什么启动字典数据会导致它通过引用正确传递?

最佳答案

问题是:

self._internal_dict = internal_dict or {}

一个空的字典是假的,所以你会在后续的递归调用中得到一个新的空字典。这就是为什么将 dict 初始化为非空(真实)“修复”它的原因。

你想要:

self._internal_dict = {} if internal_dict is None else internal_dict

关于Python 空字典没有通过引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24048802/

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