第2辑-python中命名空间与作用域的解读
python中的两个内置获得变量的字典:globals()函数:返回一个在当前作用域下的全局变量(对象)的字典。
locals()函数:返回当前作用域下局部变量(对象)的字典。
两个函数的返回类型都是字典,所以键即变量名,能用keys()函数获得,变量值能用values()函数获得。
命名空间的分类:
Local(局部命名空间):函数或类被调用时创建的,在调用结束或抛出异常后销毁
Global(全局命名空间):模块加载(某个.py文件)执行时创建,其中包含了其中定义的函数、类、其他导入的模块,解释器退出后销毁。
Built-in(内建命名空间):解释器启动时创建,解释器退出后销毁
各命名空间创建顺序:
python解释器启动 ->创建内建命名空间 -> 加载模块 -> 创建全局命名空间 ->函数被调用 ->创建局部命名空间
各命名空间销毁顺序:
函数调用结束 -> 销毁函数对应的局部命名空间 -> python虚拟机(解释器)退出 ->销毁全局命名空间 ->销毁内建命名空间
作用域:只有函数、类、模块会产生作用域,代码块不会产生作用域。
作用域的分类:
Local(局部作用域):函数内部
Enclosing(闭包):嵌套作用域,嵌套函数的外层函数内部
Global(全局作用域):模块全局,一个(.py)文件内
Built-in(内建作用域):python内置
当在某个作用域内使用某个变量(不改动该变量的值)时,会按照Local-Enclosing-Global-Built-in的查找顺序查找该变量的值,当未找到时,会发生异常:例如:NameError: name 'a' is not defined。注意若在同一个域内,不能先使用该变量,再给变量赋值的情形,例如:print(a);a = 1;否则会发生错误:UnboundLocalError: local variable 'i' referenced before assignment,因为Python语句的执行顺序是从上往下执行的。当要在某个局部命名空间(包括局部作用域和嵌套作用域)内,使用更改全局变量var_global的值时,应在使用该变量的上一行声明:global var_global当在某个局部作用域内要使用更改其父作用域(嵌套作用域中的变量var_enclosing的值时,应在使用改动该变量的上一行声明:nonlocal var_enclosing程序源码分析
num1 = 100num2 = 200# python中程序的执行顺序是从上往下按先后顺序执行的# 任何调用类、函数,以及引用更改变量的语句,必须位于所有对象定义或变量赋值之后def var_test():num3 = 300# 若直接更改num1的值,会出现‘在定义前更改变量的错误’# 或者使用num2的用法# num1 += 1global num2num2 += 1print('num1= ' + str(num1))print('num2= ' + str(num2))dict_1 = globals()dict_2 = locals()def field_var():# 若直接更改num1的值,会出现‘在定义前更改变量的错误’# 或者使用num3的用法# num1 += 1print('num1= ' + str(num1))nonlocal num3num3 += 1print('num3= ' + str(num3))field_var()dict_1 = globals()dict_2 = locals()print("输出整个程序内的全局变量的字典: ")for key1, value1 in dict_1.items():print('的值为:'.format(key1, value1))print("*" * 100)print("输出函数代码块中局部变量的字典: ")for key2, value2 in dict_2.items():print('的值为:'.format(key2, value2))var_test()
程序运行结果
num1= 100
num2= 201
num1= 100
num3= 301
加黑的为本程序创建的全局变量
输出整个程序内的全局变量的字典:
__name__ 的值为:__main__
__doc__ 的值为:None
__package__的值为:None
__spec__ 的值为:None
__annotations__的值为:{}
__builtins__的值为:
__file__ 的值为:L:/PROGRAMcoding/PycharmProjects/python_to_success/11.16/test.py
__cached__的值为:None
num1 的值为:100
num2 的值为:201
var_test 的值为:
****************************************************************************************************
输出函数代码块中局部变量的字典:
num3 的值为:301
field_var 的值为:.field_var at 0x0000025FC962C620>
代码截图
代码块1
代码块2
运行结果
领取专属 10元无门槛券
私享最新 技术干货