python 作用域查找规则
来源:互联网 发布:单片机人机界面设计 编辑:程序博客网 时间:2024/06/03 07:45
python在运行时候变量的作用域查找顺序(遵从legb规则)以此是:
local(局部作用域) -->enclosing(函数范围作用域)-->global(全局作用域)--->build-in(内建对象作用域)
我们先解释一下初学者经常遇到name "xxx" is not defined问题:
#[in]:print x[out]:"x" is not defined[in]:print list[out]:<type 'list'>[in]:print open[out]:<built-in function open>我们打印x出现错误,但是打印list,open等等不会出现错误?
因为list、dict等等为python内建对象、open,range等等为python的内建函数,而x为变量。
当解释器运行时候,解释器首先会去查找x变量所引用的对象时候被创建过,
如果没有,解释器会去查找python内部时候有次对象或者函数,有就返回没有就报错。
这里我们引出了一个关键字:built-in,在python中built-in被称为内建的命名空间,这个空间内有很多的内建函数和对象。
关于命名空间我们还有两个命名空间:local命名空间,global命名空空间
local命名空间又称函数范围内的命名空间。
global命名空间模块范围内的命名空间,
举个栗子:
a = 5def foo(): a = 3 print aprint a #5foo()#3
上面那段程序就称为global命名空间,而函数foo()里面包含的空间就是local命名空间。
而变量 a = 3为local作用域,a = 5为global作用域。
当程序运行时候,foo()会先查找本地变量a是否存在,如果不存在那么将会继续查找global变量(a=5)是否存在,
不存在将继续查找build-in内建对象是否存在,都不存在那么返回“a” is not defined。
上面程序中我们执行print a时候,此时我们需要查找的是global作用域而不是local作用域。所以输出为5
当我们执行foo()中的print a 时候,解释器会优先查找local作用域下的变量a,所以输出为3,但是如果把a=3去了以后输出将是5。
当函数为嵌套函数,也就是闭包的时候,程序将多一个作用域:enclosing作用域也称直接外围作用域。
age = 45def parent(): age = 10 def child(): print age retrun childp = parent()p() #10上面程序中age = 10为 enclosing作用域,不是local作用域。age=45为global作用域。上面程序中就没有local作用域这一说、
- python 作用域查找规则
- python的作用域规则
- Python 中的作用域规则和闭包简析
- Python 中的作用域规则和闭包简析
- Python 中的作用域规则和闭包简析
- python最内嵌套作用域规则
- Python中的作用域规则:最内嵌套作用域规则 和 LEGB
- Python LGB名称查找规则
- c++作用域规则
- 作用域规则
- 变量作用域规则
- 变量作用域规则
- C 作用域规则
- JAVA(SE7)作用域规则
- As3变量作用域规则
- Python 变量作用域 —— 命名空间与 LEGB 规则
- python函数作用域(global)及形参默认值规则
- Python中查找属性和接口的规则
- Apk源码的加固(加壳)原理解析和实现
- [BZOJ3944]Sum-杜教筛
- Range Sum Query
- 关于Swift的私有化
- PAT-A-1073. Scientific Notation (20)
- python 作用域查找规则
- 以考代学
- 神经网络pooling层
- uboot烧写2
- windows安装pygame(Python3.6)
- doc2vec用于分类 deeplearning4j实现
- Raspberry Pi: 查看Raspberry Pi的ip地址
- 类加载器
- Apache还想再活五百年