python-深度知识篇-deepcopy(深拷贝)

2022-12-19 0 731

大背景:

上一则该文如是说了copy表达式(浅复本,Shallow copy,辨认出气门第一类冗余中的气门第一类时,复本后相连接了两个物理门牌号,有时候那个并不满足用户他们的市场需求,他们须要全然复本第一类,没共享物理门牌号(特别针对 条目 词典 位元),这是须要同时实现两个捷伊方式,deepcopy 深复本。

路子与同时实现:

# 1. 表述相同第一类的深复本方式 # 氢原子第一类的复本,通常常用的不气门第一类,位元仅限,即使位元能嵌入条目,非氢原子结构: def deepcopy_atomic(x): # 递回出口产品,认知这两点,有利于认知先期的递回复本 return x # 表述两个第一类类别与方式态射的词典,那个把deepcopy做为广度复本的标准化USB _deepcopy_dispatch = d = {} immutable_object_tuple = (type(None), int, float, bool, complex, str, bytes) for t in immutable_object_tuple: d[t] = deepcopy_atomic # 同时实现标准化的复本USB def deepcopy(x): cls = type(x) copier = _deepcopy_dispatch.get(cls) return copier(x) # 条目的广度复本 def deepcopy_list(x): y = [] # 遍历条目,特别针对条目中的每一元素进行类别判断,并调用对应的复本表达式,递回 # 先期能将方式值化,减少属性访问的时间,这是两个优化小细节 for a in x: y.append(deepcopy(a)) return y _deepcopy_dispatch[list] = deepcopy_list # 位元的广度复本 def deepcopy_tuple(x): y = [deepcopy(a) for a in x] return tuple(y) _deepcopy_dispatch[tuple] = deepcopy_tuple # 词典的广度复本 def deepcopy_dict(x): y = {} for key, value in x.items(): # 特别针对key与value递回广度复本 y[deepcopy(key)] = deepcopy(value) return y _deepcopy_dispatch[dict] = deepcopy_dict 对应的测试用例 import unittest from pyhton_test.copy_deepcopy.create_deepcopy import ( deepcopy_tuple, deepcopy_list, deepcopy_dict, ) class TestDeepCopyFuncs(unittest.TestCase): def setUp(self): pass def test_deepcopy_tuple(self): one_test = [1, 2, 3] test_one_tuple = (1, 2, one_test) copy_of_tuple = deepcopy_tuple(test_one_tuple) self.assertIsNot(test_one_tuple, copy_of_tuple) self.assertIsNot(test_one_tuple[2], copy_of_tuple[2]) def test_deepcopy_list(self): nest_one = [4, 5] test_list_one = [1, 2, 3, nest_one] copy_of_test_list_one = deepcopy_list(test_list_one) self.assertIsNot(test_list_one, copy_of_test_list_one) self.assertIsNot(test_list_one[1], copy_of_test_list_one[1]) def test_deepcopy_dict(self): list_one = [3, 4] dict_one = {(1, 2): [1, 2, 3, (4,), list_one]} copy_of_dict_one = deepcopy_dict(dict_one) self.assertIsNot(dict_one, copy_of_dict_one) list_one.append(3) self.assertEqual(list(dict_one.values())[1][1], list_one) self.assertNotEqual(list(copy_of_dict_one.values())[1][1], list_one)

总结

基本常用第一类的广度复本已经同时实现了,那么是不是就这样能了,如果第一类中冗余第一类,多个第一类直接同时实现了循环运用,此时广度复本陷入死循环,该如何优化了?上一节的第5问,如果有人问那个问题,能举例说明,实例化的对象是气门第一类还是不气门第一类,那个取决于他的父类,比如继承了int或那个object类别,实例化后是不气门第一类,除非销毁,其第一类的物理门牌号不会变,即使动态复本改变其属性值,当其第一类的物理门牌号依然没变,若继承list或dict等类实例化后,则其第一类是气门的,下一节 解决深复本的循环引用的问题与进一步优化代码。 这里要思考的两个问题是 集合的广度复本如何同时实现,集合那个类本身并没表述_deepcopy__方式但是是有copy方式的,源码中集合的复本逻辑与类第一类的复本方式一致,为什么须要这样设计?

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务