注:这段代码在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