新年开始,Python之父龟叔给我们出了一道Print题目,竟然难道了一堆老司机

对于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领域的趣味原创干货!目前已经发布了几个视频。赶紧扫描下方二维码关注这个有趣的视频好吧!

年度爆款文案

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值