标签:ror code 就是 ble 定义 代码 地方 名称 全局
首先我们看看下面的代码:
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()
标签:ror code 就是 ble 定义 代码 地方 名称 全局
原文地址:https://www.cnblogs.com/xiayuhao/p/9461018.html