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

2024-05-12 22:14:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在阅读thispost,现在正在尝试创建一个类来修改字典,并将修改后的字典存储在一个新变量中,而不会对原始字典产生任何影响。代码如下:

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方法,或者还有其他方法


Tags: selfobjnewobjectismydefupdate
1条回答
网友
1楼 · 发布于 2024-05-12 22:14:30

另一种方法是考虑您对对象执行的操作类型,并以不影响原始对象的方式复制它。例如,在你的例子中,你不仅仅是在操作字典;您正在对列表字典进行操作,并修改列表,因此需要尽可能地复制列表的元素。然而,如果这些元素本身也是结构,您就不必复制它们的内容

当然,这样做依赖于您非常清楚代码的功能。这很容易,但在更复杂的系统中,很难跟踪。对于这种情况,deepcopy()是一种完全有效的方法

相关问题 更多 >