治疗白癜风的好医院 http://m.39.net/pf/a_5291113.html
#为任意对象做深复制和浅复制,校车乘客在途中上车和下车
classBus:
def__init__(self,passengers=None):
ifpassengersisNone:
self.passengers=[]
else:
self.passengers=list(passengers)
defpick(self,name):
self.passengers.append(name)
defdrop(self,name):
self.passengers.remove(name)
# 使用copy和deepcopy产生的影响
importcopy
bus1=Bus([Alice,Bill,Claire,David])
bus2=copy.copy(bus1)
bus3=copy.deepcopy(bus1)
print(id(bus1),id(bus2),id(bus3))#使用copy和deepcopy,创建3个不同的Bus实例。
bus1.drop(Bill)
print(bus2.passengers)#[Alice,Claire,David]bus1中的Bill下车后,bus2中也没有他了。
print(id(bus1.passengers),id(bus2.passengers),id(bus3.passengers))#222356166597审查passengers属性后发现,bus1和bus2共享同一个列表对象,因为bus2是bus1的浅复制副本。
print(bus3.passengers)#[Alice,Bill,Claire,David]bus3是bus1的深复制副本,因此它的passengers属性指代另一个列表。
#一般来说,深复制不是件简单的事。如果对象有循环引用,那么这个朴素的算法会进入无限循环。deepcopy函数会记住已经复制的对象,因此能优雅地处理循环引用,循环引用:b引用a,然后追加到a中;deepcopy会想办法复制a
a=[10,20]
b=[a,30]
a.append(b)
print(a)#[10,20,[[...],30]]
fromcopyimportdeepcopy
c=deepcopy(a)
print(c)#[10,20,[[...],30]]
#此外,深复制有时可能太深了。例如,对象可能会引用不该复制的外部资源或单例值。我们可以实现特殊方法__copy__()和__deepcopy__(),控制copy和deepcopy的行为,
预览时标签不可点收录于话题#个上一篇下一篇