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