Питон - почему он не создает новый экземпляр объекта? [дубликат]

этот вопрос уже есть ответ здесь:

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

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

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: изменяемый аргумент по умолчанию