我开了一家餐厅

发布时间 :2022-07-20

​​作者:小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) 

如果你希望我更新某个特定小知识,欢迎给我留言。

我开了一家餐厅​​​​
今日热门