python 深浅拷贝及实践
深拷贝:拷贝对象的内容。
浅拷贝:拷贝对象的引用。相当于拷贝对象的引用。
(个人并不喜欢用盒子,标签等概念来区别,用一个概念大致解释另一个概念有时会加深理解的难度。。。)
一些例子
可变类型作为函数参数
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)
(待续)