鱼C论坛

 找回密码
 立即注册
查看: 7707|回复: 38

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

[复制链接]
发表于 2021-4-8 11:52:26 | 显示全部楼层 |阅读模式
本帖最后由 v.ki 于 2021-4-8 15:49 编辑

   新年那会,python之父———Guido Van Rossum 留给了我们一道题目,虽然只有十行,但是难道了很多老司机


1.png



      这就是题目,a,b充当了全局变量和局部变量,要大家分析在类c里面如果打印,会打印的是哪个呢?




                               
登录/注册后可看大图



小明同学:1,1呗 ,这不是基础题么
众人:如果这么直白 python之父会发出来问大家么




大家可以打印一发试试
  1. a=0
  2. b=0
  3. def f():
  4.     a=1
  5.     b=1
  6.     class c:
  7.         
  8.         print(a,b)
  9.         a=2
  10.         
  11. f()
复制代码


纳尼?

怎么是0,1呢


别慌


把c类里面的a=2注释掉再试一发,会发现变回了大家想要的结果


vk以为



先看看这样的代码
  1. a=0
  2. b=0
  3. def f():
  4.     a+=1
  5.     print(a)

  6. f()
复制代码


      程序会报错对吧,因为函数里没定义 a ,得用global在函数里引用全局变量

再看看这样的
  1. a=0
  2. b=0
  3. class c:
  4.     a+=1
  5.     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在类中被赋值(观察)了,打印出来的是全局变量,没被赋值(观察)的那个是局部变量

以上,有的部分是俺胡猜的,有什么其他见解或者批评建议都可以在评论区指出



                               
登录/注册后可看大图



更多推荐:想看看进程,线程是什么东西的在这里:线程,进程,协程


结束时间: 2021-7-6 23:49 裁判: v.ki

正方观点 (20)

我赞同,v.k 的观点

反方观点 (1)

我反对,那么在评论区留下你的理解吧

辩手:3 ( 加入 )
 
辩手:0 ( 加入 )
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复

    使用道具 举报

    发表于 2021-4-8 12:12:02 | 显示全部楼层

    回帖奖励 +3 鱼币

    本帖最后由 不喝酒怎么醉 于 2021-4-8 12:19 编辑

    前后解释自相矛盾
    当第十行的代码没有注释掉的时候,Python解释器首先会在类C中寻找有无变量a的定义,发现没有后,就直接跳转到全局变量中
    回到这个题目,在类c中,打印这个是在a被赋值前的,而a在类中被赋值(观察)了,打印出来的是全局变量

    类中的变量在引用前 如果没有定义,就会去全局变量中寻找(如果没有就报错), 而不是函数中。
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复

    使用道具 举报

     楼主| 发表于 2021-4-8 12:24:12 From FishC Mobile | 显示全部楼层
    不喝酒怎么醉 发表于 2021-4-8 12:12
    前后解释自相矛盾
    当第十行的代码没有注释掉的时候,Python解释器首先会在类C中寻找有无变量a的定义,发 ...

    再仔细看一下,说的是一个意思
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复

    使用道具 举报

     楼主| 发表于 2021-4-8 12:28:32 From FishC Mobile | 显示全部楼层
    不喝酒怎么醉 发表于 2021-4-8 12:12
    前后解释自相矛盾
    当第十行的代码没有注释掉的时候,Python解释器首先会在类C中寻找有无变量a的定义,发 ...

    原因都是由于a在类中的被赋值,但是赋值是在打印后的,所以打印的时候是全局变量
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复

    使用道具 举报

    发表于 2021-4-8 12:31:05 | 显示全部楼层
    v.ki 发表于 2021-4-8 12:24
    再仔细看一下,说的是一个意思

    当第十行的代码没有注释掉的时候,Python解释器首先会在类C中寻找有无变量a的定义,发现没有后,就直接跳转到全局变量中

    但其实类C中有定义,只不过是在引用之后,这里说法不严谨。
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复

    使用道具 举报

     楼主| 发表于 2021-4-8 12:34:11 From FishC Mobile | 显示全部楼层
    本帖最后由 v.ki 于 2021-4-13 18:06 编辑
    不喝酒怎么醉 发表于 2021-4-8 12:31
    当第十行的代码没有注释掉的时候,Python解释器首先会在类C中寻找有无变量a的定义,发现没有后,就直接跳 ...


    嗯是不太严谨没说清楚,这里说的是print这句代码,先不考虑后面的
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复

    使用道具 举报

    发表于 2021-4-8 15:13:08 | 显示全部楼层

    回帖奖励 +3 鱼币

    本帖最后由 crisfo 于 2021-4-8 15:16 编辑

    类里包含的变量,先在类里找,发现使用之前没被赋值,再到全局里去找。
    类里不包含的变量,顺序查找使用,必须在使用前被定义赋值过。
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复

    使用道具 举报

    发表于 2021-4-8 17:09:21 | 显示全部楼层

    回帖奖励 +3 鱼币

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

    使用道具 举报

    发表于 2021-4-8 19:13:29 | 显示全部楼层

    回帖奖励 +3 鱼币

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

    使用道具 举报

    发表于 2021-4-8 19:33:15 | 显示全部楼层

    回帖奖励 +3 鱼币

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

    使用道具 举报

    发表于 2021-4-9 10:26:28 | 显示全部楼层

    回帖奖励 +3 鱼币

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

    使用道具 举报

    发表于 2021-4-9 12:06:08 | 显示全部楼层

    回帖奖励 +3 鱼币

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

    使用道具 举报

    发表于 2021-4-9 12:06:21 | 显示全部楼层

    回帖奖励 +3 鱼币

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

    使用道具 举报

    发表于 2021-4-9 12:06:32 | 显示全部楼层

    回帖奖励 +3 鱼币

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

    使用道具 举报

    发表于 2021-4-9 12:06:43 | 显示全部楼层

    回帖奖励 +3 鱼币

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

    使用道具 举报

    头像被屏蔽
    发表于 2021-4-9 12:06:55 | 显示全部楼层

    回帖奖励 +3 鱼币

    提示: 作者被禁止或删除 内容自动屏蔽
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复

    使用道具 举报

    发表于 2021-4-9 12:07:09 | 显示全部楼层
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复

    使用道具 举报

    发表于 2021-4-9 12:46:36 From FishC Mobile | 显示全部楼层

    回帖奖励 +3 鱼币

    双缝干涉是小学学的吗?不是高中阶段考纲内容吗
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复

    使用道具 举报

    发表于 2021-4-10 08:04:10 | 显示全部楼层

    回帖奖励 +3 鱼币

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

    使用道具 举报

    发表于 2021-4-10 08:15:57 | 显示全部楼层

    回帖奖励 +3 鱼币

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-20 13:57

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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