函数作用域与名称空间
Posted xiayuhao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数作用域与名称空间相关的知识,希望对你有一定的参考价值。
函数作用域与名称空间
首先我们看看下面的代码:
a = 10
def f1():
print(a)
f1() 10
#不会报错
a = 10
def f1():
print(a)
a = 1
f1()
#UnboundLocalError: local variable ‘a‘ referenced before assignment
这句话的含义是变量a在定义前调用
为什么会出现这样的错误呢?
这就要从函数的作用域与名称空间说起了
什么是名称空间?
顾名思义,名称空间就是存放名字的地方,python中名称空间有三种:
- 内置名称空间
- 全局名称空间
- 局部名称空间
名称空间的加载顺序为:内置名称空间----->全局名称空间------->局部名称空间
名称空间的查找顺序刚好相反:局部名称空间----->全局名称空间-----> 内置名称空间
需要注意的是在全局无法查看局部的名称,在局部却可以查看全局的
作用域是什么?
作用域是能够影响的范围空间,作用域范围又分为两种:
- 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,局部有效
- 局部范围(局部名称空间属于该范围):临时存活,局部有效
其中,作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关
清楚了这些后,上面的错误大家就应该可以明白了。
在执行函数f1,打印a的时候,会先从自己的名称空间中找a,如果没有找到,就会去外面一层的名称空间去找,最后到全局去找,所以,上面代码不会报错,但是下面的代码就多了一行对a的赋值,就报错了,原因就是代码是从上之下执行的,在还没有对a赋值前f1中是没有a的,所以会出现未定义先使用的错误,
解决方法:
在使用前先声明 nonlocal
a = 10 def f1(): a = 2 def f2(): nonlocal a a += 1 f2() f1()
以上是关于函数作用域与名称空间的主要内容,如果未能解决你的问题,请参考以下文章