1. import aaa; aaa.T = new_value
方式改写全局变量
aaa:
T = 20
def test():
print("模块aaa的函数:print T = {}; id(T)= {}".format(T, id(T)))
bbb:
import aaa
print("aaa模块中的全局变量 T = {}; id(T)= {}".format(aaa.T, id(aaa.T)))
aaa.T = 5
print("bbb中改写全局变量 T = {}; id(T)= {}".format(aaa.T, id(aaa.T)))
aaa.test()
可见,在bbb中改写 aaa.T 时,变换了T对象的实体。
2. from aaa import T
载入全局变量
如果bbb中调用T的方式改一下呢:
import aaa
from aaa import T
print("aaa模块中的全局变量 T = {}; id(T)= {}".format(T, id(T)))
T = 5
print("bbb中改写全局变量 T = {}; id(T)= {}".format(T, id(T)))
aaa.test()
则并不会重写T对象!
3. 命名空间
注意:不同的import方式,会导致module中的内容的命名空间不同~
from module_A import X
会将该模块的函数/变量导入到当前模块的命名空间中,无须用module_A.X访问了。import module_A
modules_A本身被导入,但保存它原有的命名空间,故得用module_A.X方式访问其函数或变量。
4. nonlocal
关键字
向闭包函数传递外部的局部变量,使用 nonlocal name
在inner() 中声明name对象。
global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。
global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用,而nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误。
def TLV_header(self, body_size):
TLV_format = "!"
def setTLV(tag: str, int_type: str, value: int):
nonlocal TLV_format
unit_format = "Bc" + len_type
TLV_format += unit_format