第2辑-python中命名空间与作用域的解读

第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

运行结果

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20181116A12G2200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券