Объект меняет исходное значение.Есть ли другие методы, кроме глубокого копирования? - PullRequest
0 голосов
/ 25 декабря 2018

Я читал эту запись и сейчас пытаюсь создать класс для изменения словаря и сохранить измененный словарь в новой переменной, без какого-либо влияния на исходный словарь.Вот код:

dict_1 = {'a':[0,1,2]}
print('dict_1 before updating is :', dict_1)
#################################################

class dict_working:
    def __init__(self, my_dict):
        self.my_dict = (my_dict)

    def update_dict(self):
        for i in range(len(self.my_dict['a'])) :
           self.my_dict['a'][i] = self.my_dict['a'][i]+10
        return self.my_dict
#################################################

obj = dict_working(dict_1)
b_dict = obj.update_dict()

print('dict_1 after updating is :', dict_1)
print('A new object after updating is:', b_dict)

Но когда я пробую код, он также изменяет переменную dict_1:

dict_1 before updating is : {'a': [0, 1, 2]}
dict_1 after updating is : {'a': [10, 11, 12]}
A new object after updating is: {'a': [10, 11, 12]}

Поэтому я попытался deepcopy словарь вкласс и результаты были такими, как я хотел:

import copy
dict_1 = {'a':[0,1,2]}
print('dict_1 before updating is :', dict_1)
#################################################

class dict_working:
    def __init__(self, my_dict):
        self.my_dict = copy.deepcopy(my_dict)

    def update_dict(self):
        for i in range(len(self.my_dict['a'])) :
           self.my_dict['a'][i] = self.my_dict['a'][i]+10
        return self.my_dict

obj = dict_working(dict_1)
b_dict = obj.update_dict()
#################################################
print('After adding deepcopy method:')
print('dict_1 after updating is :', dict_1)
print('A new object after updating is:', b_dict)

Результаты:

dict_1 before updating is : {'a': [0, 1, 2]}
After adding deepcopy method:
dict_1 after updating is : {'a': [0, 1, 2]}
A new object after updating is: {'a': [10, 11, 12]}

Мой вопрос: используют ли эксперты Python тот же самый метод deepcopy в этих ситуациях илиесть другие способы?

1 Ответ

0 голосов
/ 25 декабря 2018

В качестве альтернативы можно принять во внимание, какую операцию вы выполняете над объектом, и скопировать ее таким образом, чтобы эта операция не влияла на оригинал.Например, в вашем случае вы работаете не только со словарем;вы работаете со словарем списков и изменяете списки, поэтому вам нужно будет копировать их до элементов списков.Однако, если бы сами эти элементы были также структурами, вам не пришлось бы копировать их содержимое.

Конечно, выполнение этого зависит от того, насколько хорошо вы знаете, что делает ваш код.Здесь это достаточно просто, но в более сложных системах очень сложно отследить.Для таких случаев deepcopy() - совершенно правильный подход.

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