Python – почему он не создает новый экземпляр объекта?

У меня есть небольшая проблема, которую я не понимаю.

У меня есть метод:

def appendMethod(self, newInstance = someObject()): self.someList.append(newInstace) 

Я называю этот метод без атрибутов:

 object.appendMethod() 

И на самом деле я добавляю список с тем же экземпляром someObject.

Но если я изменю его на:

 def appendMethod(self): newInstace = someObject() self.someList.append(newInstance) 

Я получаю новый экземпляр этого объекта каждый раз, какая разница?

Вот пример:

 class someClass(): myVal = 0 class otherClass1(): someList = [] def appendList(self): new = someClass() self.someList.append(new) class otherClass2(): someList = [] def appendList(self, new = someClass()): self.someList.append(new) newObject = otherClass1() newObject.appendList() newObject.appendList() print newObject.someList[0] is newObject.someList[1] >>>False anotherObject = otherClass2() anotherObject.appendList() anotherObject.appendList() print anotherObject.someList[0] is anotherObject.someList[1] >>>True 

Это связано с тем, что вы назначаете свой аргумент по умолчанию в качестве изменяемого объекта.

В python функция – это объект, который оценивается, когда он определен. Поэтому, когда вы вводите def appendList(self, new = someClass()) вы определяете new как объект-член функции, и он НЕ возвращает, оценивается во время выполнения.

см. «Наименьшее удивление» в Python: аргумент Mutable Default