社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

菜鸟学Python • 4 年前 • 303 次点击  

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


年度爆款文案


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/107768
 
303 次点击