Питон - почему он не создает новый экземпляр объекта? [дубликат]
этот вопрос уже есть ответ здесь:
у меня есть небольшая проблема, что я не понимаю.
у меня есть метод:
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
1 ответов
это потому, что вы назначаете свой аргумент по умолчанию как изменяемый объект.
в python функция-это объект, который оценивается, когда он определен, поэтому при вводе def appendList(self, new = someClass())
определении new
как объект-член функции, и он не получает повторной оценки во время выполнения.
посмотреть "наименьшее удивление" в Python: изменяемый аргумент по умолчанию