《Python局部变量和全局变量》一节中提到,全局变量可以在程序中任何位置被访问甚至修改,但是,当函数中定义了和全局变量同名的局部变量时,那么在当前函数中,无论是访问还是修改该同名变量,操作的都是局部变量,而不再是全局变量。
当函数内部的局部变量和函数外部的全局变量同名时,在函数内部,局部变量会“遮蔽”同名的全局变量。
有读者可能并不能完全理解上面这段话,没关系,这里举个实例:
name = "Python教程"
def demo ():
#访问全局变量
print(name)
demo()
程序执行结果为:
上面程序中,第 4 行直接访问 name 变量,这是允许的。在上面程序的基础上,在函数内部添加一行代码,如下所示:
name = "Python教程"
def demo ():
#访问全局变量
print(name)
name = "shell教程"
demo()
执行此程序,Python 解释器报如下错误:
该错误直译过来的意思是:所访问的 name 变量还未定义。这是什么原因呢?就是我们添加第 5 行代码导致的。
Python 语法规定,在函数内部对不存在的变量赋值时,默认就是重新定义新的局部变量。上面程序中,第 5 行就定义了一个新的 name 局部变量,由于该局部变量名和全局变量名 name 同名,局部 name 变量就会“遮蔽”全局 name 变量,再加上局部变量 name 在 print(name) 后才被初始化,违反了“先定义后使用”的原则,因此程序会报错。
那么,如果就是想在函数中访问甚至修改被“遮蔽”的变量,怎么办呢?可以采取以下 2 中方法:
name = "Python教程"
def demo ():
#通过 globals() 函数访问甚至修改全局变量
print(globals()['name'])
globals()['name']="Java教程"
#定义局部变量
name = "shell教程"
demo()
print(name)
程序执行结果为:
name = "Python教程"
def demo ():
global name
#访问全局name变量
print(name)
#修改全局name变量的值
name = "shell教程"
demo()
print(name)
程序执行结果为: