2013-09-05 7 views
6

Ho un piccolo problema che non capisco.Python: perché non crea una nuova istanza di oggetto?

Ho un metodo:

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

Io chiamo questo metodo senza attributi:

object.appendMethod() 

E in realtà io aggiungo alla lista con la stessa istanza di someObject.

Ma se cambio a:

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

ottengo nuova istanza di quell'oggetto ogni volta, qual è la differenza?

Ecco un esempio:

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

questa domanda non è strettamente * * correlato al valore di default mutevole, ma è di circa * quando vengono creati * valori di default. @tomek tieni presente che ogni funzione mantiene una ** tupla ** dei suoi valori predefiniti nell'attributo '__defaults__'. Ma cosa significa? Beh, sicuramente dal momento che 'tuple's sono funzioni immutabili * non può * creare un valore predefinito ogni volta che vengono chiamate, quindi il valore predefinito viene creato solo * una volta * a funzione * definizione *. Provare a cambiare 'someObject' con una funzione come' def func(): print ("called") 'e vedere quando viene chiamata questa funzione. – Bakuriu

+0

Questa è una buona domanda. Sicuramente mi ha confuso quando venivo dal C++ - land dove le funzioni sono oggetti di seconda classe valutati all'esecuzione della funzione piuttosto che la definizione della funzione. – Shashank

risposta

2

Questo perché si sta assegnando il tuo argomento di default come un oggetto mutabile.

In python, una funzione è un oggetto che viene valutato quando viene definito, quindi quando si digita def appendList(self, new = someClass()) si sta definendo new come oggetto membro della funzione e NON viene rivalutato al momento dell'esecuzione.

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

+0

grazie, ora capisco cosa succede. È controintuitivo per me, ma ho capito. Ho dimenticato di pensare a funzioni come oggetti. –

Problemi correlati