【发布时间】:2018-12-25 08:44:26
【问题描述】:
我正在阅读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 方法还是有其他方法?
【问题讨论】:
-
这是一般方式,如果您需要深拷贝,可以
-
从技术上讲,您可以利用结构共享,如果您的对象是不可变的(通常是因为您共享对它们的引用),您可以假设它们永远不会改变,只关心差异或“编辑”。 Python 中没有简单的方法,但可以通过一些努力来实现。 en.wikipedia.org/wiki/Persistent_data_structure
-
python 提供的功能并不容易。但是您可以使用其他库来实现此结果。事实上,我遇到的大多数数据库用例都是为了这个。