关于globals和locals
print(locals()) # 编号1 print(globals()) # 编号2 x = 1 def func(): y = 1 print(globals()) # 编号3 print(locals()) # 编号4 def func0(): z = 1 print(locals()) # 编号5 print(globals()) # 编号6 func0() func()
打印结果:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0329C230>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/tutorial/test1.py', '__cached__': None}
这是编号1打印的。
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0329C230>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/tutorial/test1.py', '__cached__': None}
这是编号2打印的。
从编号1和编号2的打印结果来分析,发现在同一文件test1.py中(单一文件),在第一层级调用locals()和globals(),得到的结果是一样的。
locals():返回本地作用域中的所有名字。这里的本地指的就是test1.py这个文件范围。
globals():返回全局作用域中的所有名字。这里的全局指的就是test1.py这个文件范围。
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0329C230>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/tutorial/test1.py', '__cached__': None, 'x': 1, 'func': <function func at 0x032BF858>}
这是编号3打印的。
{'y': 1}
这是编号4打印的。
从编号3和编号4的返回结果来分析,编号3调用globals(),指的是文件范围。除了默认的那些名字,还包括变量x和函数名func。因为代码是一行一行执行的,当执行到编号3的代码时,变量x和函数名
func刚好生成,所以添加到了原先的globals()中,组成了新的globals()。
编号4的locals()在函数内部,因此表示当前函数内部的名字。从函数func开始,截止到locals()这条命令,只声明了y这个变量,因此locals()只返回y这一个名字。
记住:locals()指的是本地,它在哪,它的本地就是哪,所以没有固定的地方。
{'z': 1}
这是编号5打印的。
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0329C230>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/tutorial/test1.py', '__cached__': None, 'x': 1, 'func': <function func at 0x032BF858>}
这是编号6打印的。
执行到编号5时,打印的是locals(),因为从func0函数开始,截止到print(locals()),中间只声明了一个z变量。因此只打印了z这个名字。
执行到编号6时,打印的是globals(),因此打印的也是全局名字,跟函数内部完全无关。也就是说,在这个文件中,排除掉函数内部的名字,其他名字都在globals()的范畴中。

m = 1 def test(): print(m) test()
1、函数内部可以访问全局变量,只读。(查找范围是:本地,全局,最后是内置)
m = 1 def test(): global m m += 1 print(m) test() print(m)
2、函数内部要想修改全局变量,需要在函数内部添加global m,如果不加,就会报错。
def test(): n = 2 def inner(): nonlocal n # 通过nonlocal影响上层的n n += 1 print(n) inner() test()
3、通过nonlocal,影响当前函数的上层函数中的变量。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号