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

向上修改一级的不是全部修改 如果函数内部找不到 就会报错

原文地址:https://www.cnblogs.com/surehunter/p/7562898.html