一、命名空间概念 |
命名空间(name space),若变量x=1,1存放在内存中,命名空间是存放名字x、x与1绑定关系的地方。
命名空间分三种:
- locals:函数内的名称空间,包括局部变量和形参
- globals:全局变量,函数定义所在模块的名字空间
- builtins:内置模块的名字空间 dir(__builtins__)查看所有内置方法
作用域:python中一个函数就是一个作用域,局部变量放置在其作用域中;代码定义完成后,作用域已经完成,作用域链向上查找
C# Java中作用域{}
不同变量的作用域不同就是由这个变量所在的命名空间决定的:
作用域即范围:
全局范围:全局存活,全局有效
局部范围:临时存活,局部有效
二、作用域查找顺序 |
LEGB:locals ——>enclosing(相邻的上一级) ——>globals ——> __builtins__
- locals 是函数内的名字空间,包括局部变量和形参
- enclosing 外部嵌套函数的名字空间
- globals 全局变量,函数定义所在模块的名字空间
- builtins 内置模块的名字空间
n = 10 def fun1(): n = 20 print(‘func1‘,n) def fun2(): n = 30 print(‘func2‘,n) def func3(): print("func3",n) # locals没有,先找相邻上一级作用域 func3() # 20 fun2() # 30 fun1() # 30
def func(): level = ‘L1‘ n = 33 print(locals()) # {‘level‘: ‘L1‘, ‘n‘: 33} def outer(): n = 44 level = ‘L2‘ print(locals(), n) def inner(): level = ‘L3‘ print(locals(), n) inner() # {‘n‘: 44, ‘level‘: ‘L3‘} 44 outer() # {‘n‘: 44, ‘level‘: ‘L2‘} 44 func()
三、嵌套函数返回值 |
age = 18 def func1(): age = 73 def func2(): age = 84 print(age) return 666 val = func1() print(val) ‘‘‘ 输出:666 ‘‘‘ # 函数名可以当作返回值 age = 18 def func1(): age = 73 def func2():... return func2 # 返回一个函数名# val = func1() print(val) ‘‘‘ 输出:<function func1.<locals>.func2 at 0x101462598> ‘‘‘ # 代码写完之后作用域已经生成,不管函数名传到哪里,只要执行都回回定义的地方往上找 age = 18 def func1(): age = 73 def func2(): print(age) return func2 # 返回一个函数名不带括号 val = func1() val() ‘‘‘ 输出结果:73 ‘‘‘
四、查看作用域方法 |
globals(),locals()