2013-09-05 4 views
6

Ich habe ein kleines Problem, das ich nicht verstehe.Python - Warum erstellt es keine neue Instanz von Objekt?

Ich habe eine Methode:

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

ich ohne Attribute diese Methode aufrufen:

object.appendMethod() 

Und ich anhängen tatsächlich die Liste mit der gleichen Instanz von Someobject.

Aber wenn ich es ändern:

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

ich neue Instanz dieses Objekt jedes Mal, was ist der Unterschied?

Hier ist ein Beispiel:

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

diese Frage nicht ist * * strikt auf den wandelbaren Standardwert bezogen, sondern ist über * wenn * Standardwerte erstellt werden. @tomek Beachten Sie, dass jede Funktion ein ** 'Tupel' ** ihrer Standardwerte im Attribut '__defaults__' behält. Aber was bedeutet das? Nun, da 'Tupel' unveränderliche Funktionen sind * können * nicht jedes Mal einen Standardwert erzeugen, wenn sie aufgerufen werden, daher wird der Standardwert nur * einmal * bei Funktion * Definition * erzeugt. Versuchen Sie 'someObject' mit einer Funktion wie' def func(): print ("called") 'zu ändern und sehen Sie, wann diese Funktion aufgerufen wird. – Bakuriu

+0

Das ist eine gute Frage. Es hat mich bestimmt verwirrt, als ich aus C++ kam - Land, wo Funktionen Objekte der zweiten Klasse sind, die bei der Ausführung von Funktionen und nicht bei der Definition von Funktionen ausgewertet werden. – Shashank

Antwort

2

Dies liegt daran, dass Sie Ihr Standardargument als veränderbares Objekt zuweisen.

In Python ist eine Funktion ein Objekt, das bei der Definition ausgewertet wird. Wenn Sie also def appendList(self, new = someClass()) eingeben, definieren Sie new als Memberobjekt der Funktion und es wird zur Ausführungszeit NICHT erneut ausgewertet.

sehen “Least Astonishment” in Python: The Mutable Default Argument

+0

danke, jetzt verstehe ich, was passiert. Es ist kontra intuitiv für mich, aber ich verstehe es. Ich habe vergessen, Funktionen als Objekte zu betrachten. –