#为任意对象做深复制和浅复制,校车乘客在途中上车和下车

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的行为,

预览时标签不可点收录于话题#个上一篇下一篇


转载请注明地址:http://www.tanhuaa.com/gjth/7887.html