美文网首页
Python3问答:你能看出output_weird_var为什

Python3问答:你能看出output_weird_var为什

作者: 字节的风 | 来源:发表于2019-04-14 21:07 被阅读0次

注:这段代码在ipython控制台上运行。可以放心大胆地忽略In[x]:Out[x]:

In [1]: weird_var = 10                                                          

In [2]: def output_weird_var(): 
   ...:     print(weird_var) 
   ...:     weird_var = 8 
   ...:                                                                         

In [3]: output_weird_var()                                                      
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-3-a2380e15bbdf> in <module>
----> 1 output_weird_var()

<ipython-input-2-61aa2b8190b7> in output_weird_var()
      1 def output_weird_var():
----> 2     print(weird_var)
      3     weird_var = 8

UnboundLocalError: local variable 'weird_var' referenced before assignment

In [4]: normal_var = 10                                                         

In [5]: def output_normal_var(): 
   ...:     global normal_var 
   ...:     print(normal_var) 
   ...:     normal_var = 8 
   ...:                                                                         

In [6]: output_normal_var()                                                     
10

In [7]: normal_var                                                              
Out[7]: 8

别往下看哦,下面是答案

答案:

Python先编译了函数output_weird_var。因为我们在函数中有赋值weird_var = 8,所以Python解释器认为weird_var是一个局部变量。但是它是一个全局变量!
最后,Python解释器凌乱了!默认查找局部变量的可怜的Python解释器,就这样一直查找局部变量weird_var。由于最后才在函数内给weird_var赋值,执行print(weird_var)时在函数内部还没有对于weird_var的赋值,所以Python解释器认为找不到变量,返回了如此的Traceback:

---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-3-a2380e15bbdf> in <module>
----> 1 output_weird_var()

<ipython-input-2-61aa2b8190b7> in output_weird_var()
      1 def output_weird_var():
----> 2     print(weird_var)
      3     weird_var = 8

UnboundLocalError: local variable 'weird_var' referenced before assignment

为什么output_normal_var能正常工作?

因为我们有global关键字!Python看到这样的关键字后,会在整个程序内寻找全局变量normal_var
最后Python在函数的外部找到了normal_var ,正常获得了它的值,执行语句normal_var = 8时,Python也修改了在程序中的全局变量normal_var

In [4]: normal_var = 10                                                         

In [5]: def output_normal_var(): 
   ...:     global normal_var    # global关键字真的很关键!(半开玩笑,但是重申:真的很关键!)
   ...:     print(normal_var) 
   ...:     normal_var = 8 
   ...:                                                                         

In [6]: output_normal_var()                                                     
10

In [7]: normal_var                                                              
Out[7]: 8

相关文章

  • Python3问答:你能看出output_weird_var为什

    注:这段代码在ipython控制台上运行。可以放心大胆地忽略In[x]:或Out[x]: 别往下看哦,下面是答案 ...

  • 职场邮件的高段位写法!

    今天是老于陪你的第11天。 1.标题要达到呼唤你,愉悦你的效果,能引起别人看的兴趣,通过标题能大致看出需要自己做什...

  • 《看见自己》文子

    你坐下来 就只是坐下来 告诉自己什么也不想 可能吗? 你在想什么? 你知道吗? 不如 去看看吧 或许能看出来你为什...

  • 大梦谁先觉平生我自知 一首小诗意味深长 诸葛亮做的是什么梦?

    前言 前几天在问答里看到了这个问题: “大梦谁先觉,平生我自知。草堂春睡足,窗外日迟迟。”你也喜欢这几句诗吗?为什...

  • 仔猪黄痢,白痢,水肿病,都是大肠杆菌惹的祸

    摘要:猪病通课堂为你精选最新养猪问答。仔猪大肠杆菌怎么防治?生石灰有没有消毒作用?怎么看出副猪的前兆? 仔猪大肠杆...

  • 想要的结果

    ​能​力​决​​定​​了​​​你​​​能​​做​什​​么, ​​动​机​决定​​了​​你​要​做​​什​​么, ​...

  • 从你的嘘嘘看出你的健康情况

    今天就来和你们科普一下。如果你关心从你的嘘嘘看出你的健康情况自己的健康状态,一定要听仔细咯: 先来告诉你们尿液为什...

  • 我的第六幅水彩画(临摹)

    首先,我要吐槽! 你你你你,玩玩玩什什什么么么么手机?!为为为什什什么么不不不不画画画画画画? 哈哈,因为懒。 放...

  • 保持完整,疗愈灵魂

    写在前面:本来只是想运用一下问答的模式来梳理,结果发现写着写着就很多,于是就直接变成问答式的读书笔记吧。 作者为什...

  • 最佳方式

    今天看见一个路边问答的视频。问一个女孩子说你男朋友没有车,没有房,没有存款,只有一颗爱你的心,你愿意嫁给他吧,为什...

网友评论

      本文标题:Python3问答:你能看出output_weird_var为什

      本文链接:https://www.haomeiwen.com/subject/ygtewqtx.html