命名空间与作用域

命名空间加载顺序

  • python解释器启动加载:内置命名空间
  • 执行.py文件加载:全局命名空间
  • 调用函数产生:局部命名空间
名字查找顺序:
  •  LEGB法则:locals -> enclosing function -> globals -> builtins
  • 局部命名空间 --->闭包函数命名空间 ---> 全局命名空间 ---> 内置命名空间
globals() #返回全局作用域中 变量:值 组成的字典
locals() #返回局部作用域中 变量:值 组成的字典
 
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
a_global = 1
 
 
def func(pram1):
    "普通函数"
    a_local = 2
    print(globals())
    print(locals())
 
def encFunc(parm2):
    "闭包函数"
    out_local = 3
    print('outer:'globals())
    print('outer:'locals())
    def innerFunc(parm3):
        in_local = 4
        print('inner:',globals())
        print('inner:'locals())
    return innerFunc
 
func(3)
encFunc(3)
encFunc(3)(1)
'''输出:
{...省略...,'a_global': 1, 'func': <function func at 0x0000017B61A52E18>, 'encFunc': <function encFunc at 0x0000017B63735378>}
{'a_local': 2, 'pram1': 3}
outer: {...省略...,'a_global': 1, 'func': <function func at 0x0000015BDAFC2E18>, 'encFunc': <function encFunc at 0x0000015BDB195378>}
outer: {...省略...,'out_local': 3, 'parm2': 3}
inner: {...省略...,'a_global': 1, 'func': <function func at 0x00000145A9492E18>, 'encFunc': <function encFunc at 0x00000145AB185378>}
inner: {'in_local': 4, 'parm3': 1}
'''

 

posted @ 2018-05-20 22:08  Ron_White  阅读(226)  评论(0编辑  收藏  举报