я новичок в python, и сегодня у меня была эта проблема:
скажем, у меня есть этот код, включающий два класса с именами: sliceи 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)
выход:
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>]
Я думал, что: list_matбудет 2 матовых объекта (что верно на выходе print(len(list_mat)))
И я думал, что у каждого matобъекта list_matбудут 4 sliceобъекты, и varдля каждого объекта sliceбудет 1 2 3 4и 5 6 7 8для каждого объекта mat.
Но когда дело дошло до фактического matобъекта в памяти list_mat, у всех matбыли 8 sliceобъекты, и у них были точно такие же 8 sliceобъекты в памяти.
Когда я отлаживал, я обнаружил, что когда я создал второй matобъект, в __init__нем selfуже было предыдущее значение (которое было slicesсоздано для первого mat). Так что, когда я передал второй список 5 6 7 8для конструктора, он просто добавил бы другие 4 sliceобъекты для второго mat, что дало бы мне результат 8 sliceобъектов.
Другое дело, когда matсоздавалась вторая, то __sliceв первой она matпревращалась __sliceво вторую mat! На самом деле, когда я проверил функцию при отладке, я __init__обнаружил, что адрес второго объекта был адресом первого объекта, который уже был создан.matselfmat
Должно быть что-то deepcopy, что я пропустил.
Итак, подводя итог:
1: во время цикла for selfобъект для matкласса всегда имеет предыдущие данные, оставшиеся после создания первого matобъекта.
2: во время цикла for, как я могу выполнить глубокое копирование и создать совершенно новый объект со всем, что было создано в памяти?
Любой совет поможет!
дайте мне знать, если вы не понимаете мой вопрос!
Пожелания!
Решение проблемы
@jasonharper был прав.....
class mat():
__slices = []
Этот код создает переменную CLASS LEVEL, которая используется всеми экземплярами класса. Это полезно, например, если вы хотите иметь object_countпеременную, которую вы увеличиваете при создании объекта и уменьшаете при уничтожении. Но в вашем случае вы хотите, чтобы каждый matобъект имел свой собственный __slices, поэтому вы хотите определить эту переменную внутри __init__():
def __init__(self,var:list) -> None:
self.__var = var
self.__slices = []
Комментариев нет:
Отправить комментарий