Можно создать дубликат:
“Least Astonishment” in Python: The Mutable Default Argumentкласс Python и экземпляр атрибута спутанность
Для класса
class ValidationResult():
def __init__(self, passed=True, messages=[], stop=False):
self.passed = passed
self.messages = messages
self.stop = stop
работает
foo = ValidationResult()
bar = ValidationResult()
foo.messages.append("Foos message")
print foo.messages
print bar.messages
производит
['Foos message']
['Foos message']
пока это
foo = ValidationResult()
bar = ValidationResult(messages=["Bars message"])
foo.messages.append("Foos message")
print foo.messages
print bar.messages
производит
['Foos message']
['Bars message']
Я думаю, что я пропустил лодку на понимании атрибутов объекта здесь. В первом примере я ожидал, что Foos message
применим только к foo
. Каков правильный способ объявить атрибут объекта, только изменяемый его экземпляром?
Использование Python 2.7.1
Есть много вопросов об этом. Не используйте изменяемые объекты в качестве аргумента по умолчанию для функции ... – JBernardo
http://stackoverflow.com/questions/2639915/why-the-mutable-default-argument-fix-syntax-is-so-ugly-asks-python -newbie http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument и т. д. – kennytm