python中变量作用于并不陌生,函数中的是局部变量,先看一个小例子:
In [1]: def f1(a):
...: print(a)
...: print(b)
调用
f1(3)
很明显这个会报错
NameError Traceback (most recent call last)
<ipython-input-3-a636accabfae> in <module>()
----> 1 f1(3)
<ipython-input-1-8c139ea215ce> in f1(a)
1 def f1(a):
2 print(a)
----> 3 print(b)
4
NameError: name 'b' is not defined
这时我们需要添加对b的赋值操作
b = 5
在执行一下
In [5]: f1(3)
3
5
说明在执行函数时函数会去全局变量中找b的值
这点明白之后我们再来看一个让人有点吃惊的例子:
In [6]: b = 6
In [7]: def f1(a):
...: print(a)
...: print(b)
...: b = 9
看完函数你一定会觉得打印时候b应该显示6吧,我们看看结果
UnboundLocalError Traceback (most recent call last)
<ipython-input-8-a636accabfae> in <module>()
----> 1 f1(3)
<ipython-input-7-b4880e75da42> in f1(a)
1 def f1(a):
2 print(a)
----> 3 print(b)
4 b = 9
5
UnboundLocalError: local variable 'b' referenced before assignment
什么?报错了,显示本地变量在赋值前使用!
事实是:python编译函数的定义体时,判断b是局部变量,所以在执行时会获取b之前没有定义,所以报错,我们将b的定义放到打印之前就好了,这恰恰说明了python调用的过程顺序,先局部,后全局。
还有一种解决办法就是在使用b之前使用global声明b要用全局变量里面的
如果还想进一步看看解释器的加载内容,可以使用python的dis模块来查看,过程更加清晰。