2009-07-15 2 views
0

Хорошо, так что весь день меня гасили.Странная проблема с классами и дополнительными аргументами

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

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} 

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

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

+0

Следует ли считать это обманом? Было много вопросов/проблем, которые люди использовали на основе используемого по умолчанию изменяемого типа данных. –

+0

Вот один, всего час назад: http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument –

+0

Просто в стороне: нет необходимости в '' '. join' строка (вы создаете одну строку с вызовом 'str'). – cdleary

ответ

6

Поскольку вы 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) 
+0

Да, я знаю, но это становится очень грязным, когда вы имеете дело с конструкторами, которые требуют нескольких необязательных аргументов. Я не знаю, что я более или менее расстроен тем, что я потратил столько времени на что-то подобное. :( – UberJumper

+0

Нет ничего о нескольких необязательных аргументах. Проблема в том, что вы используете изменяемый по умолчанию, в этом случае словарь. –

+0

Нет, но если у меня есть несколько необязательных аргументов, давайте скажем 5 необязательных аргументов, которые принимают списки/карты, тогда это становится довольно большой болью. Я думаю, что python должен просто исправить это :) – UberJumper

Смежные вопросы