2012-05-21 2 views
0

Я пытаюсь написать объект-оболочку вокруг объекта словаря в Python, как такPython по умолчанию/необязательные переменные

class ScoredList(): 
    def __init__(self,dct={}): 
     self.dct = dct 

list = ScoredList() 
list.dct.update({1,2}) 

list2 = ScoredList() 
list.dct.update({"hello","world"}) 

print list1.dct, list2.dct # they are the same but should not be! 

Похоже, я не могу создать новый объект ScoredList, или, вернее, каждый забитый список объект имеет один и тот же базовый словарь. Почему это?

class ScoredList2(): 
    def __init__(self): 
     self.dct = {} 

Приведенный выше код для ScoredList2 отлично работает. Но я хочу знать, как правильно перегрузить конструктор в python.

+4

обязательной ссылки: http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument. – DSM

+3

'{" hello "," world "}' не является словарем, '{1,2}' тоже. – Tadeck

ответ

4

Словарь является изменяемым объектом. В Python значения по умолчанию анализируются при создании функции, что означает, что каждому новому объекту присваивается одинаковый пустой словарь.

Чтобы решить эту проблему, просто сделать что-то вроде:

class ScoredList(): 
    def __init__(self, dct=None): 
     self.dct = dct if dct is not None else {} 
+0

потрясающий! и какой быстрый ответ спасибо! – kumikoda

+4

Возможно, это будет 'dct, если dct не является None else {}', иначе, если вы пройдете пустой словарь, '__init __()' создаст новый, вместо того, чтобы использовать тот, который вы предоставили. –

+0

Вы также можете сделать 'dct или {}'. Хотя, может быть, не так ясно. –

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