热线电话:13121318867

登录
首页精彩阅读我开了一家餐厅
我开了一家餐厅
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)

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

我开了一家餐厅

数据分析咨询请扫描二维码

最新资讯
更多
客服在线
立即咨询