deepcopy踩坑记录

117 阅读1分钟

问题描述

使用继承dict的类对象进行深度拷贝时,出现报错。 image.png

问题诊断

查看deepcopy的源码,发现使用原始dict,_deepcopy_dict方法里x.items()能正常遍历,使用继承dict的类对象却无法遍历出正常的value。

正常遍历的情况: image.png 异常遍历的情况: image.png 由于无法获取value,进而无法进行拷贝。

解决办法

解决办法一:使用原始dict传参,不使用继承dict的类对象

解决办法二:实现一个deepcopy方法

办法二实现如下:

查看自定义类的实现,是由构造函数传入一个待拷贝对象,然后复制给自身self[tname] = json_data[jname]

image.png image.png

那么可以将自身作为构造函数的入参传入,得到一个自定义的dict对象。

image.png

然后x.items()遍历各个键值对进行深拷贝,判断为自定义的dict对象,则用自身的deepcopy方法;原始dict,则使用copy.deepcopy()方法。

image.png