#python #oop
#python #ооп
Вопрос:
У меня возникла проблема с двумя созданными мной объектами. У меня есть цикл while, который получает некоторые данные. Я сохраняю эти данные в объекте, и в каждом цикле я хочу видеть, изменились ли мои данные. Если это правда, я сохраняю данные в журнале. Проблема в том, что когда я обновляю свой actVar, мой prevVar тоже меняется. Это мой код:
Я безуспешно пытался использовать функцию copy()
uvcomsSup = UVCEComsCtrl_SupportData()
uvcomsAntSup = UVCEComsCtrl_SupportData()
while 1:
try:
uvcomsSup = getUVComsSupport(OrigAddress, UVComsDestAddress)
print(uvcomsSup)
print("________________________")
print(uvcomsAntSup)
print(uvcomsSup is uvcomsAntSup)
if (uvcomsSup != uvcomsAntSup):
uvcomsAntSup = copy.copy(uvcomsSup)
logFile.addSupportData(str(uvcomsSup))
sleep(1)
except Exception as err:
print("Error inesperado:", sys.exc_info()[0])
print(err)
Когда я печатаю эти два объекта (у меня есть метод eq и метод str) Я вижу те же значения. Я просто ввожу условие if в первый раз.
Любая помощь?
Спасибо
Комментарии:
1. Попробуйте использовать deepcopy вместо copy
Ответ №1:
Я не могу запустить ваш код, поэтому не вижу всей картины.
Однако я вижу, что вы возвращаете неглубокую копию ucomsSup
, которая сохраняет ссылки на исходный объект, изменяя его.
Попробуйте вместо этого использовать глубокую копию.
uvcomsSup = UVCEComsCtrl_SupportData()
uvcomsAntSup = UVCEComsCtrl_SupportData()
while 1:
try:
uvcomsSup = getUVComsSupport(OrigAddress, UVComsDestAddress)
print(uvcomsSup)
print("________________________")
print(uvcomsAntSup)
print(uvcomsSup is uvcomsAntSup)
if (uvcomsSup != uvcomsAntSup):
uvcomsAntSup = copy.deepcopy(uvcomsSup) ## Create deep copy
logFile.addSupportData(str(uvcomsSup))
sleep(1)
except Exception as err:
print("Error inesperado:", sys.exc_info()[0])
print(err)
Ответ №2:
В документах Python говорится:
copy(x) Возвращает мелкую копию x.
Мелкая копия создает новый составной объект, а затем (насколько это возможно) вставляет в него ссылки на объекты, найденные в оригинале.
Попробуйте вместо этого использовать copy.deepcopy(x) .
uvcomsAntSup = copy.deepcopy(uvcomsSup)
copy.deepcopy(x) Возвращает глубокую копию x.
Глубокая копия создает новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале.
Подробнее об этом: https://docs.python.org/3.7/library/copy.html