大背景:
上一则该文如是说了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)