python的变量作用域
# 1、作用域即范围 - 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效 # - 局部范围(局部名称空间属于该范围):临时存活,局部有效 # 2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关 # LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__ # locals 是函数内的名字空间,包括局部变量和形参 # enclosing 外部嵌套函数的名字空间(闭包中常见) # globals 全局变量,函数定义所在模块的名字空间 # builtins 内置模块的名字空间
name = 'ajune globals' # globals
def fun():
name = 'ajune enclosing' # enclosing
def fun1():
name = 'june locals' # locals
print(name)
return fun1()
fun() # 结果是 june locals
fun() # 将name = 'june locals'注释掉后,结果是ajune enclosing
fun() # 将name = 'june locals'和name = 'ajune enclosing'注释掉后,结果是ajune globals
当要使用内部函数与外部函数之间的变量时,可以通过关键字nonlocal来使用变量
def fun():
name = 'ajune enclosing' # enclosing
print(name, id(name))
def fun1():
nonlocal name # locals
print(name, id(name))
return fun1()
fun()
通过id()可以看到fun1()函数使用的name 还是属于enclosing层的。那如果想使用global层的变量呢?在使用的时候通过global关键词使用。并且通过这种方式还可以在内部函数内修改外部的变量。对于列表就不要这样了,列表属于全局变量,在函数内部可以直接使用。