python变量作用域中容易忽略的点

python中变量作用于并不陌生,函数中的是局部变量,先看一个小例子:

In [1]: def f1(a):
   ...:     print(a)
   ...:     print(b)

调用

f1(3)

很明显这个会报错

NameError                                 Traceback (most recent call last)
 in ()
----> 1 f1(3)

 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)
 in ()
----> 1 f1(3)

 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模块来查看,过程更加清晰。

你可能感兴趣的:(python变量作用域中容易忽略的点)