2013-09-05 17 views
6

Mam mały problem, którego nie rozumiem.Python - dlaczego nie tworzy nowej instancji obiektu?

Mam metodę:

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

nazywam tę metodę bez atrybutów:

object.appendMethod() 

A właściwie, dołączyć listę z tej samej instancji someObject.

Ale jeśli zmienię go:

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

dostaję nową instancję tego obiektu za każdym razem, co za różnica?

Oto przykład:

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 
+0

kwestia ta nie jest ściśle * * związane z zmienny wartość domyślną, ale jest o * kiedy * Wartości domyślne są tworzone. @tomek pamiętać, że każda funkcja zachowuje ** 'tuple' ** swoich domyślnych wartości w atrybucie' __defaults__'. Ale co to znaczy? Cóż, z pewnością, ponieważ 'tuple's są niezmiennymi funkcjami * nie może * tworzyć wartości domyślnej za każdym razem, gdy są wywoływane, stąd domyślna wartość jest tworzona tylko * raz * w funkcji * definicja *. Spróbuj zmienić 'someObject' za pomocą funkcji' def func(): print ("called") 'i zobacz kiedy ta funkcja zostanie wywołana. – Bakuriu

+0

To jest dobre pytanie. To z pewnością mnie zdezorientowało, kiedy pochodziłem z C++ - ziemi, gdzie funkcje są obiektami drugiej klasy ocenianymi przy wykonywaniu funkcji, a nie definicji funkcji. – Shashank

Odpowiedz

2

To dlatego, że przypisanie domyślnej argumentu jako zmienny obiektu.

W pythonie funkcja jest obiektem, który jest oceniany, gdy jest zdefiniowany, więc gdy wpiszesz def appendList(self, new = someClass()) definiujesz new jako obiekt członkowski tej funkcji i NIE zostanie ponownie oceniony w czasie wykonywania.

zobaczyć “Least Astonishment” in Python: The Mutable Default Argument

+0

dziękuję, teraz rozumiem co się dzieje. Jest to dla mnie intuicyjne, ale rozumiem. Zapomniałem myśleć o funkcjach jako o obiektach. –

Powiązane problemy