作者:小K
来源:麦叔编程
❝
今天给大家讲个灵异的故事。
❞
我有一个餐厅的类,有它我就可以在某街上开餐厅(实例)了。
class Restaurant:""" 经常发生灵异事件的餐厅 """# 实例化时正在餐厅的食客,这里的diner是开业时来的食客def __init__(self, diner=[]): self.diner = diner # 食客进入餐厅def enter(self, name): self.diner.append(name) # 食客走出餐厅def out(self, name): self.diner.remove(name)
张三拿着我的“图纸”开了一家kfc,
# 张三开了一家肯德基,麦叔和Kevin是老客户,所以早早来了 kfc = Restaurant(["Maishu","Kevin"]) # 当前在餐厅的食客print(kfc.diner) # Kevin吃完离开了 kfc.out("Kevin") # Jason进来了 kfc.enter("Jason") # 当前在餐厅的食客print(kfc.diner)
输出结果:
['Maishu', 'Kevin']['Maishu', 'Jason']
李四一看kfc生意不错在隔壁开了一家山寨的kfc -- ktc,
ktc = Restaurant() # 当前在餐厅的食客print(ktc.diner) # 人气差,开业时没人关顾,Annie前来尝鲜 ktc.enter("Annie") # Annie的追求者Dave也跟着进来了 ktc.enter("Dave") # 当前在餐厅的食客print(ktc.diner)
输出结果:
[] ['Annie', 'Dave']
王五一看,这两家店生意都还不错,于是又山寨了李四的ktc,在街上开起了kfo,
# kfo新店开张,没有人来。 kfo = Restaurant() # 当前在餐厅的食客print(kfo.diner) # 明明没开张确有两名幽灵食客??? kfo.out("Annie") # Annie给Dave发了好人卡走了# 当前在kfo餐厅的食客print(kfo.diner) # 此时在李四ktc餐厅的食客print(ktc.diner)
输出结果:
['Annie', 'Dave']['Dave']['Dave']
❝
发生在王五kfo餐厅的事,是不是很诡异,实例化的时候明明没传进去任何参数,实例却自带俩“食客”。。。
❞
❝
还有,王五kfo餐厅中的Annie走后,李四的ktc餐厅中的Annie也走了。感觉冥冥之中有一只无形的手在操作这一切。
❞
问题的根源在于默认实参在定义函数时计算(通常在加载模块时),因此默认实参变成了函数对象的属性。
如果默认实参是可变对象,而且修改了它的值,那么后续的函数调用都会受到影响。
为了避免这个问题,通常使用None作为接受可变值的参数的默认值。
class Restaurant:""" 正常的餐厅 """# 实例化时正在餐厅的食客,这里的diner是开业时来的食客def __init__(self, diner=None):if diner == None: self.diner = [] else: self.diner = diner # 食客进入餐厅def enter(self, name): self.diner.append(name) # 食客走出餐厅def out(self, name): self.diner.remove(name)
如果你希望我更新某个特定小知识,欢迎给我留言。