im new to python and today i had this problem:
say, i have this code incluing two classes named: slice and mat:
class slice():
    def __init__(self, var:int) -> None:
        self.__var = var
    @property
    def var(self):
        return self.__var
class mat():
    __slices = []
    def __init__(self,var:list) -> None:
        self.__var = var
        for i in var:
            self.__slices.append(slice(i))
    @property
    def val(self):
        return self.__var
    @property
    def slices(self):
        return self.__slices
ori_data = [
    [1,2,3,4],
    [5,6,7,8]
]
list_mat = []
for i in ori_data:
    list_mat.append(mat(i))
print(len(list_mat))
for i in list_mat:
    print(i.slices)
output:
2 [<__main__.slice object at 0x000002B20597E908>, <__main__.slice object at 0x000002B205957FC8>, <__main__.slice object at 0x000002B2059C7588>, <__main__.slice object at 0x000002B2059C76C8>, <__main__.slice object at 0x000002B2059C7508>, <__main__.slice object at 0x000002B2059D3708>, <__main__.slice object at 0x000002B2059D37C8>, <__main__.slice object at 0x000002B2059D3808>] [<__main__.slice object at 0x000002B20597E908>, <__main__.slice object at 0x000002B205957FC8>, <__main__.slice object at 0x000002B2059C7588>, <__main__.slice object at 0x000002B2059C76C8>, <__main__.slice object at 0x000002B2059C7508>, <__main__.slice object at 0x000002B2059D3708>, <__main__.slice object at 0x000002B2059D37C8>, <__main__.slice object at 0x000002B2059D3808>]
I thought that: the list_mat would have 2 mat object(which is true by the output of print(len(list_mat)))
And i thought every mat object in list_mat would have 4 slice objects and the var for  each slice obj would be 1 2 3 4 and 5 6 7 8 for each mat obj.
But when it came to the actual mat object in the list_mat,every mat have 8 slice objects and they had the exactly same 8 slice objects in the memory.
When i debugged, i found that when i created the second mat object, in the __init__, the self already had previous value(which were the slices created for the first mat). So that when i passed the second list 5 6 7 8 for the constructor, it would just add another 4 slice objects for the second mat which gave me the result of 8 slice objects.
Another thing is when the second mat was created, the __slice in the first mat changed into the __slice in the second mat! Actually when i checked the __init__ function when debugged, i found that the address of the second mat‘s self object, it was the address of the first mat object which had beed created already.
There must be some deepcopy stuff i have missed.
So to sum:
1: during a for loop, the self obj for the mat class always has the previous data left by the creation of the first mat obj
2: during a for loop, how can i deepcopy and created a whole new obj with everything created new in the memory
Any advice would help!
let me know if you don’t understand my question!
Wishes!
Advertisement
Answer
@jasonharper had it right…..
class mat():
    __slices = []
This code creates a CLASS LEVEL variable which is shared by all instances of the class.  This is useful for example, if you wanted to have a object_count variable which you increment during object creation and decrement during destruction.  But, in your case, you want each mat object to have its own __slices, so you want to define that variable within __init__():
    def __init__(self,var:list) -> None:
        self.__var = var
        self.__slices = []