Python的学习之旅———名称空间与作用域
名称空间:存放名字的地方,例子:x=1,1存放于内存中,名称空间正是存放名字x与1绑定关系的地方
内置名称空间 全局名称空间 局部名称空间
1、python解释器先启动,因而首先加载的是:内置名称空间
2、执行文件,然后以文件为基础,加载全局名称空间
3、在执行文件的过程中如果调用函数,则临时产生局部名称空间
名称空间:存放名字与值绑定关系的地方
内置名称空间:
存放的是:内置的名字与值的绑定关系
生效:python解释器启动
失效:Python解释器关闭
全局名称空间
存放的是:文件级别定义的名字与值的绑定
生效:执行python文件时,将该文件级别定义的名字与值的绑定关系存放起来
失效:文件执行完毕
局部名称空间
存放的是:函数内部定义的名字与值的绑定关系
生效:调用函数时,临时生效
失效:函数调用结束
加载顺序:先内置,再全局,最后局部
查找名字的顺序:先局部,再全局,最后内置
需要注意的是:在全局无法查看局部的,在局部可以查看全局的
# max=1
def f1():
# max=2
def f2():
# max=3
print(max) #p2
f2()
f1()
print(max) #P1
max=1 是全局 都可以取到
P1 =1 P2 =1
max=2
赋值要在打印前
作用域
全局作用域:包含内置名称空间的名字与全局名称空间的名字
全局存活,全局有效
局部作用域:包含局部名称空间的名字
临时存活,局部有效
LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__ locals 是函数内的名字空间,包括局部变量和形参 enclosing 外部嵌套函数的名字空间(闭包中常见) globals 全局变量,函数定义所在模块的名字空间 builtins 内置模块的名字空间
globals() 里面放的是全局作用域里空间的对应关系 以字典的形式展现 如果在全局定义 x=10000000001 也会在print下
展现出来 不是把x的值存起来,也不是以字典存的.只是用字典的形式显示出来了。包括 内置 和全局
locals()放在哪就显示那的空间名字 如果locals放在全局 那么就有 locals() is globals().
如果放在 定义的函数内部 就会显示内部的空间名对应。这个时候 !=globals()
作用域关系,在函数定义时,就已经固定了,与调用位置无关
global 在任何地方用,都是修改全局的变量值 global x
x=1111
nonlocal 在函数内部用 逐级网上修改 相应的是值 nonlocal x
x=1111
def f1():
x=2
def f2():
x=6
def f3():
nonlocal x # 把 x=106向上找 x 修改x=106
x=106
f3()
print(x)
f2()
print(x)
f1()
结果
106
2
向上修改一级的不是全部修改 如果函数内部找不到 就会报错