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作用域这一说、


原创粉丝点击