I have a little problem that I do not understand.
I have a method:
def appendMethod(self, newInstance = someObject()):
self.someList.append(newInstace)
I call this method without attributes:
object.appendMethod()
And actually I append the list with the same instance of someObject.
But if I change it to:
def appendMethod(self):
newInstace = someObject()
self.someList.append(newInstance)
I get new instance of that object every time, what's the difference?
Here's an example:
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
This is because you are assigning your default argument as a mutable object.
In python, a function is an object that gets evaluated when it is defined, So when you type def appendList(self, new = someClass())
you are defining new
as a member object of the function, and it does NOT get re-evaluated at execution time.
see “Least Astonishment” in Python: The Mutable Default Argument
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With