为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中设置嵌套字典:为什么类方法的行为与独立函数不同?

在 Python 中设置嵌套字典:为什么类方法的行为与独立函数不同?

Smart猫小萌 2021-07-29 17:55:19
考虑这个简化的类: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


查看完整回答
反对 回复 2021-08-03
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号