Как сказал Игнасио, любые мутации, которые происходят с аргументами по умолчанию в списке функций, останутся на всю жизнь класса.
С http://docs.python.org/reference/compound_stmts.html#function-definitions
Значения параметров по умолчанию оцениваются
когда определение функции
казнены. Это означает, что
Выражение вычисляется один раз, когда
функция определена, и что это
то же «предварительно вычисленное» значение используется для
каждый звонок. Это особенно
важно понимать, когда по умолчанию
Параметр является изменяемым объектом, таким как
список или словарь: если
функция изменяет объект (например,
добавление элемента в список),
значение по умолчанию фактически изменено.
Это вообще не то что было
предназначена. Способ обойти это использовать
Ни один по умолчанию, и явно
проверить это в теле
функция.
Но это вызывает некоторую ошибку, вы изменяете ссылку ... Так что вы можете изменять список, который потребитель класса, который не должен был быть изменен:
Например:
class A:
def foo(self, x = [] ):
x.append(1)
self.x = x
a = A()
a.foo()
print a.x
# prints: [1]
a.foo()
print a.x
# prints: [1,1] # !!!! Consumer would expect this to be [1]
y = [1,2,3]
a.foo(y)
print a.x
# prints: [1, 2, 3, 1]
print y
# prints: [1, 2, 3, 1] # !!!! My list was modified
Если вместо этого вы скопируете его: (См. http://docs.python.org/library/copy.html)
import copy
class A:
def foo(self, x = [] ):
x = copy.copy(x)
x.append(1)
self.x = x
a = A()
a.foo()
print a.x
# prints: [1]
a.foo()
print a.x
# prints: [1] # !!! Much better =)
y = [1,2,3]
a.foo(y)
print a.x
# prints: [1, 2, 3, 1]
print y
# prints: [1, 2, 3] # !!!! My list is how I made it