Как создавать независимые объекты - PullRequest
0 голосов
/ 10 апреля 2019

У меня проблема с двумя объектами, которые я создал.У меня есть цикл получения некоторых данных.Я сохраняю эти данные в объекте и в каждом цикле я хочу видеть, изменились ли мои данные.Если это правда, я сохраняю данные в журнале.Проблема в том, что когда я обновляю свой 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 method) Я вижу те же значения.Я просто ввожу условие if в первый раз.

Любая помощь?

Спасибо

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Я не могу запустить ваш код, поэтому я не вижу всю картинку.

Однако я вижу, что вы возвращаете поверхностную копию из 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)
0 голосов
/ 10 апреля 2019

Документы Python говорят:

copy (x) Возвращает мелкую копию x.

Мелкая копия создает новый составной объект, а затем (насколько это возможно) вставляет ссылки в него предметам, найденным в оригинале.

Попробуйте вместо этого использовать copy.deepcopy (x).

uvcomsAntSup = copy.deepcopy(uvcomsSup) 

copy.deepcopy (x) Возвращает глубокую копию x.

Глубокая копия создает новый составной объект, а затем рекурсивно вставляет в него копии предметов, найденных в оригинале.

Подробнее об этом: https://docs.python.org/3.7/library/copy.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...