5、变量作用域
1)理解变量作用域
根据定义变量的位置:
- 局部变量:在函数中定义的变量包括参数
- 全局变量:在函数外面、全局范围内定义的变量
2)变量字典
获取变量字典:
- globals() 返回全局范围内所有变量组成的“变量字典”
- locals() 返回当前局部范围内所有变量组成的“变量字典”
- vars(object) 返回指定对象的范围内所有变量组成的“变量字典”,若不传入object 参数,vars() 和 local() 的作用相同
# 全局变量
a = 10
def info():
# 局部变量
b = 'python'
print(locals()) # 局部变量字典
def bar():
# 局部变量
c = 'java'
print(locals()) # 局部变量字典
print(globals()) # 全局变量字典
info()
bar()
print(locals()) # 全局范围内用 local() 和 globals() 作用相同
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000C3BF10B0F0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/Code/src/2019.06.21/04.py', '__cached__': None, 'a': 10, 'info': <function info at 0x000000C3BD5D3E18>, 'bar': <function bar at 0x000000C3BF373950>}
{'b': 'python'}
{'c': 'java'}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000C3BF10B0F0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/Code/src/2019.06.21/04.py', '__cached__': None, 'a': 10, 'info': <function info at 0x000000C3BD5D3E18>, 'bar': <function bar at 0x000000C3BF373950>}
分析:全局变量字典中显示了 Python 自动添加的其他全局变量。
3)处理局部变量遮蔽全局变量
说明:全局变量默认可在所有函数内访问,若在函数中定义了与全局变量同名的变量,此时就会发生局部变量遮蔽(hide)全局变量的情形。
name = 'python'
def info():
print(name)
info()
python
name = 'python'
def info():
print(name)
# 在函数内对变量赋值时定义了新的变量,导致前一行的 name 没有定义,则报错:这个局部变量在赋值之前使用了。
# 即此时不认为 name 为全局变量而是新变量
name = 'java'
print(name)
info()
UnboundLocalError: local variable ‘name’ referenced before assignment
解决方式:
-
使用 golbals() 在函数中访问被遮蔽的全局变量
name = 'python' def info(): print(globals()['name']) # 使用golbals() 在函数中访问被遮蔽的全局变量 name = 'java' print(name) info() print(name) # 全局变量没有改变
python
java
python -
global 声明该函数中 name 始终使用全局变量
name = 'python'
def info():
global name # global 声明该函数中 name 始终使用全局变量
name = 'java' # 此时,此处不是重新定义局部变量
print(name)
info()
print(name) # 全局变量改变
java
java