Установка вложенного словаря в Python: почему метод класса ведет себя не так, как автономная функция? - PullRequest
0 голосов
/ 30 октября 2018

Рассмотрим этот упрощенный класс:

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'}}}}.

Но чем они отличаются?

EDIT: я запускал эти примеры на Python 3.6.6

1 Ответ

0 голосов
/ 30 октября 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...