关于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,影响当前函数的上层函数中的变量。

posted @ 2019-11-06 15:06  道霖  阅读(196)  评论(0)    收藏  举报