Странная проблема с классами и необязательными аргументами - PullRequest
0 голосов
/ 15 июля 2009

Хорошо, так это сводило меня с ума весь день.

Почему это происходит:

class Foo:
    def __init__(self, bla = {}):
        self.task_defs = bla
    def __str__(self):
        return ''.join(str(self.task_defs))

a = Foo()
b = Foo()
a.task_defs['BAR'] = 1
print 'B is ==> %s' % str(b)
print 'A is ==> %s' % str(a)

Дает мне вывод:

B is ==> {'BAR': 1}
A is ==> {'BAR': 1}

Я знаю, что это связано с тем, что Python передает все по ссылке.

Но почему это происходит? Это буквально заставляло меня сходить с ума весь день, в основном заставляя меня порвать мои вещи на части. Разве Python не должен быть достаточно умным, чтобы иметь дело с чем-то вроде этого?

1 Ответ

6 голосов
/ 15 июля 2009

Поскольку в аргументах bla изначально установлен непостоянный тип (в данном случае dict), он становится общим, поскольку bla не переинициализируется в новый экземпляр dict для каждого экземпляра, созданного для Foo. Вот, попробуйте это вместо:

class Foo:
    def __init__(self, bla=None):
        if bla is None:
            bla = {}
        self.task_defs = bla
    def __str__(self):
        return ''.join(str(self.task_defs))

a = Foo()
b = Foo()
a.task_defs['BAR'] = 1
print 'B is ==> %s' % str(b)
print 'A is ==> %s' % str(a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...