我们都知道全局变量在所有函数内部都可以被访问到,但是如果在函数中定义了与全局变量同名的变量,此时,会发生局部变量遮蔽(hide)全局变量的情形。
a = 1
def fn():
'''
正常访问全局变量
'''
print(a) # 1
fn()
a = 1
def fn():
'''
局部变量遮蔽全局变量情形
'''
print(a)
a = 2
fn()
# UnboundLocalError: local variable 'a' referenced before assignment
# UnboundLocalError:赋值之前引用的本地变量'a'
上边第二段代码,我们在函数体最后定义了a变量,结果访问a报错!
python语法规定:在函数内部,对不存在的变量进行赋值时,默认就是重新定义新的局部变量。因此,函数内部,a = 2相当于重新定义了一个局部变量,这样全局变量a就会被遮蔽,所以会报错!
解决上述问题:
方法一:
使用globals():该函数,返回全局范围内所有变量组成的字典。(还有locals():该函数返回当前局部范围内所有变量组成的 ‘ 变量字典 ’ ;还有vars(object):该函数获取指定对象范围内所有变量组成的 “变量字典” , 如果不传入object,vars和object作用完全相同)
# 方法一:
a = 1
def fn():
print(globals())
print(globals()['a']) # 1
a = 2
fn()
# 上边print输出的是一个字典
"""
{
'__name__': '__main__',
'__doc__': None,
'__package__': None,
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0171C230>,
'__spec__': None,
'__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>,
'__file__': 'G:/mypython/mk/py_package/m4.py',
'__cached__': None,
'a': 1,
'fn': <function fn at 0x0173F7C8>
}
"""
方法二:
在函数中声明全局变量:
a = 'global'
def fn():
global a
print(a) # global
a = "local"
fn()
print(a) # local
上边代码,在函数中声明全局变量a,程序会把a变量当成全局变量,这意味着fn函数里边对a赋值的语句,只会对全局变量赋值,而不是重新定义局部变量!!!
补充:
如果全局和函数内部有同名变量,函数内部只有加了global之后,全局变量才会被局部变量给覆盖:
b = '123'
def a():
b = '0'
a()
print(b) // '123'
# ---------------------------
b = '123'
def a():
global b
b = '0'
a()
print(b) // '0'