目录
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.总结
返回