2.9.2 深副本
deepcopy()创建的深副本是一个新容器,其中填充了原对象内容的副本。要建立一个list的深副本,会构造一个新的list,复制原列表的元素,然后将这些副本追加到新列表。
将前例中的copy()调用替换为deepcopy(),可以清楚地看出输出的不同。
import copy
import functools
@functools.total_ordering
class MyClass:
def __init__(self,name):
self.name = name
def __eq__(self,other):
return self.name == other.name
def __gt__(self,other):
return self.name > other.name
a = MyClass('a')
my_list = [a]
dup = copy.deepcopy(my_list)
print(' my_list:',my_list)
print(' dup:',dup)
print(' dup is my_list:',(dup is my_list))
print(' dup == my_list:',(dup == my_list))
print('dup[0] is my_list[0]:',(dup[0] is my_list[0]))
print('dup[0] == my_list[0]:',(dup[0] == my_list[0]))
列表的第一个元素不再是相同的对象引用,不过比较这两个对象时,仍认为它们是相等的。
运行结果: