python对象的引用可变性和垃圾回收3
#为任意对象做深复制和浅复制,校车乘客在途中上车和下车 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
- 上一篇文章: 5Kubernetes入门基础之Pod
- 下一篇文章: 实战教你爬取全国火锅店数量,并利用地图可