简体   繁体   中英

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

Since you made listOfInts a class variable, that's what self.listOfInts is accessing, whatever self instance it may be; so, all the append s 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.

listOfInts has been defined as a class variable.

Class variables are shared by all the instances of the class.

This behavior is useful if you want to save class-related state (a typical example would be when you want to know the number of instances of the class created.

If you want listOfInts to be unique for each instance, then you should define it in init or other method of the class as self.listOfInts

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM