对象更改原始值。除了Deepcopy,还有其他方法吗?

时间:2018-12-25 08:44:27

标签: python class deep-copy

我正在阅读this帖子,现在正尝试创建一个类来修改字典并将修改后的字典存储在新变量中,而对原始字典没有任何影响。这是代码:

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 :(得分:1)

另一种选择是考虑对对象执行的哪种操作,并以不影响原始操作的方式对其进行复制。例如,在您的情况下,您不仅在操作字典。您正在操作列表的字典,并修改列表,因此您需要复制到列表元素的最下方。但是,如果这些元素本身也是结构,则不必复制它们的内容。

当然,执行此操作取决于您非常了解代码的作用。在这里这很容易,但是在更复杂的系统中,跟踪变得非常困难。对于这种情况,deepcopy()是一种非常有效的方法。