Объяснение дано в ответах на этот вопрос . Подводя итог здесь:
Функции в Python являются своего рода объектом. Поскольку они являются своего рода объектом, они действуют как объекты при создании экземпляра. Функция, если она определена с изменяемым атрибутом в качестве аргумента по умолчанию, точно такая же, как класс со статическим атрибутом, который является изменяемым списком.
У Леннарта Регебро есть хорошее объяснение , а ответ на вопрос Роберто Лиффредо превосходен.
Чтобы адаптировать ответ Леннарта ... если у меня есть BananaBunch
класс:
class BananaBunch:
bananas = []
def addBanana(self, banana):
self.bananas.append(banana)
bunch = BananaBunch()
>>> bunch
<__main__.BananaBunch instance at 0x011A7FA8>
>>> bunch.addBanana(1)
>>> bunch.bananas
[1]
>>> for i in range(6):
bunch.addBanana("Banana #" + i)
>>> for i in range(6):
bunch.addBanana("Banana #" + str(i))
>>> bunch.bananas
[1, 'Banana #0', 'Banana #1', 'Banana #2', 'Banana #3', 'Banana #4', 'Banana #5']
// And for review ...
//If I then add something to the BananaBunch class ...
>>> BananaBunch.bananas.append("A mutated banana")
//My own bunch is suddenly corrupted. :-)
>>> bunch.bananas
[1, 'Banana #0', 'Banana #1', 'Banana #2', 'Banana #3', 'Banana #4', 'Banana #5', 'A mutated banana']
Как это относится к функциям? Функции в Python - это объекты . Это стоит повторить. Функции в Python являются объектами s.
Итак, когда вы создаете функцию, вы создаете объект. Когда вы присваиваете функции непостоянное значение по умолчанию, вы заполняете атрибут этого объекта непостоянным значением, и каждый раз, когда вы вызываете эту функцию, вы работаете с одним и тем же атрибутом. Поэтому, если вы используете изменяемый вызов (например, append), то вы модифицируете тот же объект, как если бы вы добавляли бананы к объекту bunch
.