当程序定义一个变量时,这个变量是有它的做用范围的,变量的做用范围称为变量的做用域。根据变量的位置,分为两种:python
在Python中,提供了三个工具函数获取指定范围内变量和值组成的字典。函数
使用globals()和locals()获取全局变量时,不该该被修改,修改会改变全局变量自己。而locals()获取局部变量时,即便修改了,也不会对局部变量产生影响。工具
globals(),例:ui
a = 1 def test(): b = 2 print (globals())
test() # 打印全局变量 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 1, 'test': <function test at 0x0000000002EAC1E0>} globals() # 打印全局变量 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 1, 'test': <function test at 0x0000000002EAC1E0>}
locals(),例:blog
a = 1 def test(): b = 2 print (locals()) test() # 打印局部变量 {'b': 2} print (locals()) # 打印全局变量 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': 1, 'test': <function test at 0x0000000002EAC1E0>}
vars(),例:作用域
class test01: k1 = 1 def test02(): k2 = 2 print (vars()) k3 = 3 test01.test02() # 打印test02()的局部变量 {'k2': 2} print (vars()) # 打印全局变量 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'test01': <class '__main__.test01'>, 'k3': 3} print (vars(test01)) # 打印类的属性 {'__module__': '__main__', 'k1': 1, 'test02': <function test01.test02 at 0x00000000023892F0>, '__dict__': <attribute '__dict__' of 'test01' objects>, '__weakref__': <attribute '__weakref__' of 'test01' objects>, '__doc__': None} print (test01.__dict__) # 打印类的属性 {'__module__': '__main__', 'k1': 1, 'test02': <function test01.test02 at 0x00000000023892F0>, '__dict__': <attribute '__dict__' of 'test01' objects>, '__weakref__': <attribute '__weakref__' of 'test01' objects>, '__doc__': None}
全局变量虽然能够被全部函数访问,可是若是在函数内定义了与全局变量同名的变量,就会发生局部变量遮蔽全局变量的状况,例:io
a = 1 def test(): print (a) test() # 运行成功,打印 1 def test02(): a = 2 print (a) test02() # 函数内部对不存在的变量赋值,会从新定义新的局部变量,打印 2 def test03(): print (a) a = 3 test03() # 报错UnboundLocalError: local variable 'a' referenced before assignment,因为a=3这段代码从新定义了局部变量,因此a全局变量被被遮蔽。
为了不在函数中对全局变量赋值,能够经过global语句声明全局变量。function
例:class
a = 1 def test(): # 声明a是全局变量,后面的语句将不会从新定义局部变量 global a print (a) # 打印 1 # 对全局变量进行赋值 a = 2 test() # 打印 1 print (a) # 打印 2