深拷贝:拷贝对象的内容。
浅拷贝:拷贝对象的引用。相当于拷贝对象的引用。
(个人并不喜欢用盒子,标签等概念来区别,用一个概念大致解释另一个概念有时会加深理解的难度。。。)
一些例子
可变类型作为函数参数
python中的可变类型:list,dict,set
不可变类型:number,string,tuple
我们应该避免使用可变类型作为函数参数的默认值。
一个例子(来自fluent python):
class Bus:
def __init__(self, passengers=[]):
self.passengers = passengers
def drop(self, name):
self.passengers.remove(name)
def pick(self, name):
self.passengers.append(name)
import copy
bus1 = Bus(['a', 'b'])
bus1.pick('c')
bus2 = Bus()
bus2.pick('c')
bus3 = Bus()

发现在用[]作为参数默认值的时候,相当于用一个passengers列表实例化这个对象,类似:
_passengers = []
bus2 = Bus(_passengers)
bus3 = Bus(_passengers)
避免的方式也很简单,直接在__init__时传入参数的副本即可。类似:
class Bus:
def __init__(self, passengers):
self.passengers = list(passengers)
(待续)
本文介绍了Python中的深拷贝和浅拷贝概念,强调了它们在处理可变类型作为函数参数时的区别。通过一个具体的例子展示了将可变类型如list作为默认参数可能导致的问题,并提供了避免这种问题的方法,即在初始化时对参数进行拷贝。文章提醒开发者应避免使用可变类型作为函数默认值,以防止意外的副作用。
1280

被折叠的 条评论
为什么被折叠?



