В соответствующей заметке вы должны знать об этой ловушке, которая может скоро появиться:
class A:
def __init__(self, mylist = []):
self.mylist = mylist
a = A()
a2 = A()
a.mylist.append(3)
print b.mylist #prints [3] ???
Это сбивает с толку многих людей и связано с тем, как интерпретируется код.Python сначала интерпретирует заголовки функций, поэтому он оценивает __init__(self, mylist = [])
и сохраняет ссылку на этот список в качестве параметра по умолчанию.Это означает, что все экземпляры A будут (если не предоставлен их собственный список) ссылаться на оригинальный списокПравильный код для такого действия будет
class A:
def __init__(self, mylist=None):
if mylist:
self.mylist = mylist
else:
self.mylist = []
или, если вы хотите более короткое выражение, вы можете использовать троичный синтаксис:
self.mylist = mylist if mylist else []