对于Python程序员来说,Python之父——龟叔的名号想必大家都知道,而在新的一年伊始,龟叔也给大家留了一道小小的题目,题目虽然只有短短的10行代码,但是缺难倒了一大批的Python老司机,一起来看看到底是什么样子的题目吧。
01.题目描述
上面就是龟叔出的一道Print题目,关于题目的描述非常的简单,意思就是问下面程序中的第九行会输出什么结果呢?
看到这里的小伙伴,可以先不要着急往下看,自己先打印出来看看结果。
相信绝大多数的小伙伴得到的结果会是1,1,反正小编玩Python也有5-6年了,我看了半天也觉得是这个结果!但是正确的答案是 0 ,1 。
oh my god ,啥子情况,怎么会这样呢?先别着急,我们先把第十行的程序注释掉,再来看看结果,如下图所示:
Q: 当大家注释掉第十行的代码后,现在再次运行上述的程序,结果会是什么呢?
A: 没错,这次结果就是1,1了。
看到这里的小伙伴是不是感觉非常的困惑不解,这到底是个什么原因呢?别着急,我们通过几个简单的程序一点点来解释给大家,这里面隐含了Python一个秘密,我们接着往下分析。
02.程序解秘
如果大家运行下面的程序,会得到一个报错,局部变量未定义之前就进行赋值的操作。
但是对于类的定义来说,就完全不存在这个问题,我们再来看一下下面的程序。
上述的程序中,可以看到类中对于a的先赋值后输出是能够正常运行并输出结果的,这就是Python3中类方法的一个特性。
在Python3的类中,只要对于任何的变量在任意的位置进行赋值的操作,则类都会将这个变量视为类中的局部变量。
拿上面函数中的变量a来说,类会在类的作用域中来寻找是否有变量a的定义,如果有就直接调用变量a,如果没有的话,那么类会直接在全局范围内寻找是否存在变量a,而不会像函数中直接报错。
03.龟叔的题目分析:
明白了这一点后,我们再次回到龟叔给大家出的问题当中,当第十行的代码没有注释掉的时候,Python解释器首先会在类C中寻找有无变量a的定义,发现没有后,就直接跳转到全局变量中,发现了有全局的变量a,则就调用了全局的变量a。
而对于变量y而言,首先在类C中并没有对变量y进行赋值操作,因此,变量y对于类C而言就是一个自由变量。
因此,类C会一层层的向上来寻找变量y的定义,当在第7行找到y的定义后,则类C就会直接调用y变量。因此最后的输出的结果就是0,1。
04.思考题
大家结合上面的理解,就可以理解第十行注释掉之后,程序为什么会输出1,1的原因了。
除此之外,大家可以在第十行的代码下再添加依据y=2,来看看程序的输出结果,是不是又发生了变化,如果大家能够预测出结果,那么大家就算是理解这个问题的原因了。
另外,龟叔在除夕当天成功的接种了新冠疫苗,并积极的呼吁大家戴好口罩并保持社交距离,大家也一定要注意安全,在保证安全的前提下,积极的学习起来。
最后,如果上面的题目,添加y=2,结果是多少,欢迎在留言区吱一声?
重磅!
「菜鸟学Python」的视频号开通啦!会持续以有趣的视频形式给大家带来 Python领域的趣味原创干货!目前已经发布了几个视频。赶紧扫描下方二维码关注这个有趣的视频好吧!
年度爆款文案