考虑这个简化的类:class test(object): def __init__(self): self.inner_dict = {} def nested_set_method(self, keys,value=None): end = len(keys) - 1 for index, component in enumerate(keys): if index < end or value is None: self.inner_dict = self.inner_dict.setdefault(component, {}) else: self.inner_dict[component] = value这个函数与nested_set_method上面的类相同:def nested_set_standalone(input_dict, keys,value=None): end = len(keys) - 1 for index, component in enumerate(keys): if index < end or value is None: input_dict = input_dict.setdefault(component, {}) else: input_dict[component] = value这是该类的示例用法:>>> a = test()>>> a.inner_dict{}>>> a.nested_set_method([1,2,3,4],'l')>>> a.inner_dict{4: 'l'}这是该函数在类的实例上的示例用法:>>> b = test()>>> b.inner_dict{}>>> nested_set_standalone(b.inner_dict,[1,2,3,4],'l')>>> b.inner_dict{1: {2: {3: {4: 'l'}}}}我期望类的nested_set_method这种输出{4: 'l'}有输出功能相同的nested_set_standalone是{1: {2: {3: {4: 'l'}}}}。但它们为什么不同呢?
1 回答

MYYA
TA贡献1868条经验 获得超4个赞
inner_dict在函数中是一个局部变量,但在方法中它改变了属性。简单地说,也使用局部变量:
class test(object):
def __init__(self):
self.inner_dict = {}
def get_nested_dict(self, keys):
inner_dict = self.inner_dict
for component in keys:
inner_dict = inner_dict.setdefault(component, {})
return inner_dict
def nested_set_method(self, keys,value=None):
if value is None:
return self.get_nested_dict(keys)
else:
inner_dict = self.get_nested_dict(keys[:-1])
inner_dict[keys[-1]] = value
添加回答
举报
0/150
提交
取消