Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is this Python class copying another class contents?

I'm trying to understand an estrange behavior in Python.

I have the next python code:

class IntContainer:

    listOfInts = []

    def __init__(self, initListOfInts):

        for i in initListOfInts:
            self.listOfInts.append(i)

    def printInts(self):

        print self.listOfInts

if __name__ == "__main__":

    intsGroup1 = [1,2,3,4]
    intsGroup2 = [4,5,6,7]

    intsGroups = [intsGroup1,intsGroup2]

    intsContainers = []

    for ig in intsGroups:
        newIntContainer = IntContainer(ig)
        intsContainers.append(newIntContainer)

    for ic in intsContainers:
        print ic.listOfInts

I expect to get something like:

[1, 2, 3, 4]
[4, 5, 6, 7]

But i get:

[1, 2, 3, 4, 4, 5, 6, 7]
[1, 2, 3, 4, 4, 5, 6, 7]

I have check the next question:

why is python reusing a class instance inside in function

And a lot of Python reference, but I can not understand what is happening. I think is related with the newIntContainer identifier reutilization, but I do not understand it deeply.

Why Python appears to reused the last reference for the new object, even if I have added it to a permanent list? What can I do to resolve this behavior?

Thanks ;)

like image 333
fjfnaranjo Avatar asked Feb 28 '23 04:02

fjfnaranjo


1 Answers

Since you made listOfInts a class variable, that's what self.listOfInts is accessing, whatever self instance it may be; so, all the appends are going to the same list.

If that's not what you want, you need to make listOfInts an instance variable, for example by assigning self.listOfInts = [] at the start of the __init__ method.

like image 164
Alex Martelli Avatar answered Mar 07 '23 05:03

Alex Martelli