Python 全局变量、LEGB原则

全局变量

Python 的全局变量是模块 (module) 级别的

  • 当在函数中使用变量名时,Python 依次搜索 4 个作用域
    1. Local(函数/类内部)
    2. Enclosed(外层嵌套函数/lambda内)
    3. Global(全局作用域)
    4. Built-in(内置作用域)

python默认内层作用域可以引用外层名称,但不可以改变(因为改变的话就会用到名称绑定操作),需要改变时应先使用global关键字声明,使其指向该模块下的全局变量

tt="1"
def test1():
    tt="2"
    def test2():
        global tt # 只会让test2函数体内的tt变为指向全局tt
        tt="3"
    test2() # 此处追溯到 Local tt="2"
    print(tt)
print(tt)
test1()
print(tt)
# 1 2 3

变量字典

通过以下函数可以获取变量字典
  • globals():该函数返回全局范围内所有变量组成的“变量字典”。
  • locals():该函数返回当前局部范围内所有变量组成的“变量字典”。
    • 在全局范围内调用时,有locals() == globals()
    • 通过 locals() 获取的局部范围字典,即使对它修改也不会影响局部变量。但获取的全局范围字典可以修改。
  • vars(object):获取在指定对象范围内所有变量组成的“变量字典”。如果不传入object 参数,vars() 和 locals() 的作用完全相同。
通过属性获取变量字典

每个模块具有__dict__字典属性
每个函数拥有对应的 __globals__ 字典属性,同其所属模块的 __dict__ 字典

你可能感兴趣的:(Python 全局变量、LEGB原则)