Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python - why it doesn't create a new instance of object? [duplicate]

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
like image 713
Tomek Urbańczyk Avatar asked Sep 05 '13 17:09

Tomek Urbańczyk


1 Answers

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

like image 100
Cameron Sparr Avatar answered Sep 27 '22 22:09

Cameron Sparr