码迷,mamicode.com
首页 > 其他好文 > 详细

函数作用域与名称空间

时间:2018-08-11 22:01:28      阅读:133      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!