【问题标题】:Object changes the original value. Are there other methods than deepcopy?对象更改原始值。除了 deepcopy 还有其他方法吗?
【发布时间】: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 提供的功能并不容易。但是您可以使用其他库来实现此结果。事实上,我遇到的大多数数据库用例都是为了这个。

标签: python class deep-copy


【解决方案1】:

另一种方法是考虑您对对象执行的操作类型,并以该操作不会影响原始对象的方式复制它。例如,在您的情况下,您不只是在操作字典;您正在对列表字典进行操作并修改列表,因此您需要复制到列表的元素为止。但是,如果这些元素本身也是结构,您就不必复制它们的内容。

当然,这样做依赖于您非常了解您的代码的作用。这很容易,但在更复杂的系统中,跟踪可能会变得非常困难。对于这样的情况,deepcopy() 是一种完全有效的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 2010-11-03
    • 2023-03-11
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多