Python 名称空间与作用域
名称空间:存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方
一、名称空间又分为:
内置名称空间:在python解释器启动时产生,存放一些python内置的名字
全局名称空间:在执行文件时产生,存放文件级别定义的名字
局部名称空间:在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间
用来存放该函数内定义的名字,该名字在函数调用时生效,在函数调用结束后失效
二、加载顺序
加载顺序:内置--->全局--->局部
x=1 def func():#全局 y=2 def f1():pass#局部 print import os #内置 class Foo: pass if x==1:z=3 del x
三、名字的查找顺序
局部->全局->内置
# max=1 def foo(): max=2 # print(max) foo() print(max) x=0 def f1(): x=1 def f2(): x=2 def f3(): x=3 print(x) f3() f2() print('=f1========',x) f1() def func1(): print('from func1') def func1(): print('=====?>') func1() x=1 x=10 print(x)
四、作用域
定义:作用的范围
一、分为
全局作用域:全局存活,全局有效:可以用globals()查看
max=1111111 def f1(): def f2(): def f3(): def f4(): # print(x) print(max) f4() f3() f2() f1()
局部作用域:临时存活,局部有效可以用locals()查看
def f1(): x=1 y=2 def f2():pass # print(locals()) print(globals()) f1() print(locals() is globals()) print(locals()) print(dir(globals()['__builtins__']))
二、改变全局变量
1、可以用global在局部改变全局变量
声明全局变量,如果在局部要对全局变量修改,需要在局部也要先声明该全局变量:
gcount
=
0
def
global_test():
global
gcount
gcount
+
=
1
print
(gcount)
global_test()
如果在函数中声明 gcount 是全局变量,即可对其进行修改。 正确输出 1
2、可变变量可以不需要global在函数内进行修改
l=[] def f2(): l.append('f2') f2() print(l)
3、、nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量
x=0 def f1(): # x=1 def f2(): # x=2 def f3(): # global x nonlocal x #找函数外一层的去找一直找到为止 x=3 f3() # print(x) f2() print(x) f1() print(x)
三、作用域关系
在函数定义时就已经固定于调用位置无关,在调用函数时,必须回到函数原来定义的位置去找作用域关系
x=1 def f1(): def f2(): print(x) return f2 # func=f1() # print(func) # x=10000000 # func() # x=10000000 def foo(func): x=300000000 func() #f2() x=10000000000000000000000 foo(f1()) #这里会找f1(),但会在定义f1的作用域去找x进行打印 # x=100000000