day15_名称空间

目录


1.名称空间

名称空间(namespaces):存放名字的地方,时对栈区的划分
有了名称空间之后,就可以在栈区中存放相同的名字
分为三种
Ⅰ.内置名称空间:
存放的名字:存放的python解释器内置的名字
存活的周期:python解释器启动则产生,python解释器关闭则销毁

Ⅱ.全局名称空间:运行顶级代码所产生的名字,或者说不是函数内定义,也不是内置的,剩下的

Ⅲ.局部名称空间:
存放的名字,在调用函数时,运行函数体代码过程中产生的函数内的名字
存活周期:在调用函数时存活,函数调用完毕后则销毁

名字空间的加载顺序
内置名称空间>全局名称空间>局部名称空间

名字的查找优先级:当前所在的位置向上一层一层查找
如果当前在内置名称空间
内置名称空间 > 全局名称空间 > 局部名称空间
名称空间的'嵌套'关系时以函数定义阶段为准的,与调用位置无关

示范1:

x=1
def func():
    print(x)

def foo():
    x=111
    print(x)

示范2:

x = 1
def func():
    print(x)

def foo():
    x = 111
    func()

foo()

示范3:

input=11
def f1():
    def f2():
        input=333
        print(input)
    input=222

示范4:

x=111
def func():
    print(x)
    x=222
func()

2.全局作用域和局部作用域

域:指的是范围
作用域:作用的范围
全局作用域:内置名称空间,全局名称空间
1.全局存活
2.全局有效:被所有函数共享

局部作用域:局部名称空间
1.临时存活
2.局部有效

LEGB
Builtin
Global
def f1():
    # Enclosing
    def f2():
        # Enclosing
        def f3():
            # Local
            pass

glocbal和 nonlocal
示范1:

x=111
def func():
    x=222

foo()
print(x)

示范2:如果要改全局的名字对应的值(不可变类型),需要用global

x=1
def func():
    global x # 声明x这个名字是全局的名字,不要再早新的名字了
    x=222
    print(x)

示范3:

l=[111,222]
def func():
    l.append(333)

func()

nonlocal(了解):修改函数外层函数包含的名字对应的值(不可变类型),直到找到最外层的
名称空间的定义关系是再扫描语法的时候确定的

x=0
def f1():
    x=111
    def f2():
        nonlocal x
        x=222
    f2()
3.总结

返回

猜你喜欢

转载自www.cnblogs.com/wjxyzs/p/12903165.html