鱼C论坛

 找回密码
 立即注册
查看: 2444|回复: 3

[技术交流] ptyhon 之父给我们出了一道print题目,难倒了众多小朋友!

[复制链接]
发表于 2021-4-26 20:46:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 叼辣条闯世界 于 2021-4-26 21:27 编辑

   新年那会,python之父———Guido Van Rossum 留给了我们一道题目,虽然只
有十行,但是难道了很多小朋友
微信图片_20210426204137.png
这就是题目,a,b充当了全局变量和局部变量,要大家分析在类c里面
如果打印,会打印的是哪个呢?
a=0
b=0
def f():
    a=1
    b=1
    class c:

        print(a,b)
        a=2

f()
纳尼?
怎么是0,1呢
别慌
把c类里面的a=2注释掉再试一发,会发现变回了大家想要的结果
我以为
先看看这样的代码
a=0
b=0
def f():
    a+=1
    print(a)

f()
程序会报错对吧,因为函数里没定义 a ,得用global在函数里引用全局变量
再看看这样的
a=0
b=0
class c:
    a+=1
    print(a)
是的,它是不会报错的直接打印,说明了:
类会在类的作用域中来寻找是否有变量a的定义,如果有就直接调用变量a,如果没有的话,那么类会直接在全局范围内寻找是否存在变量a,而不会像函数中直接报错
明白了这一点后,我们再次回到python 之父给大家出的问题当中 当第十行的代码没有注释掉的时候,Python解释器首先 会在类C中寻找有无变量a的定义,发现没有后, 就直接跳转到全局变量中,发现了有全局的变量a,则就调用了全局的变量a。
类其实就和闭包很像,只不过闭包没有类那么多复杂的魔法方法,都会自己生成一个自己的空间
而对于变量b而言,首先在类C中并没有对变量b进行赋值操作,因此,变量b对于类C而言就是一个自由变量。
因此,类C会一层层的向上来寻找变量b的定义,当在第7行找到b的定义后,则类C就会直接调用y变量。因此最后的输出的结果就是0,1。
看到这里的小伙伴是否想起来一个我们小学二年级学过的东西
对,没错
双缝干涉实验
它证明了波动性,之后,就说明了光具有波粒二象性。
回到这个题目,在类c中,a在类中被赋值(观察)了,所以打印出来的是全局变 量,没被赋值(观察)的b那个是局部变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-26 20:53:05 From FishC Mobile | 显示全部楼层
想鱼币都想封了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-26 21:20:56 From FishC Mobile | 显示全部楼层
wp231957 发表于 2021-4-26 20:53
想鱼币都想封了啊


封了 Ta(bushi
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-26 21:28:12 | 显示全部楼层
wp231957 发表于 2021-4-26 20:53
想鱼币都想封了啊

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 00:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表