Как создавать независимые объекты

#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