👇创建一个Bus类,并创建三个Bus对象,分别用到了潜复制和深复制,比较二者的不同。
class Bus:
def __init__(self, passengers=None):
if passengers is None: #is通常用来判断对象是否为None,它的运算速度比 == 快,因为它是不可重载的
self.passengers = []
else:
self.passengers = list(passengers)
def pick(self, name):
self.passengers.append(name)
def drop(self, name):
self.passengers.remove(name)
👆注:python用==
比较值,用is
比较引用。
👇创建三个对象,用到了copy模块中的copy和deepcopy。
import copy
bus1 = Bus(['Alice', 'Bill', 'Clarie', 'David'])
bus2 = copy.copy(bus1)
bus3 = copy.deepcopy(bus1)
id(bus1), id(bus2), id(bus3)
👇比较结果
可见,深复制是构造了新的列表,而潜复制是对原来列表进行了引用。
注意,最好不要将默认参数设为可变类型,如,上面类定义中的passengers参数,默认参数为None,但是不要定义为[]
(即,默认创建一个空列表),因为这样做会使所有类对象共享同一个列表。
在类定义中,如果passengers不为None,则通过self.passengers = list(passengers)
创建一个list副本。如果不这样做,若passengers传进来的也是一个可变对象(如,一个列表),那么会将这个列表的引用赋值给self.passengers,导致对self.passengers进行修改时,原来的外部可变对象也被修改,这显然是不合理的。