Python中的变量阴影
在本文中,我们将了解Python编程语言中变量阴影的概念。要理解这个概念,我们需要熟悉Python中变量生命周期的范围。
局部变量:
当我们定义一个函数时,我们可以创建仅作用于该函数的变量,并且在函数之外是不可访问的。这些变量被称为局部变量(因为它们是函数的局部变量)
Python3
def fn():
# local variable a
a = 3
print(a)
# Error, variable a referenced before
# assignment
print(a)
Python3
# global variable
a = 3
def fn():
# print 3
print(a)
# print 3
print(a)
Python3
# global variable
a = 3
def fn():
# local variable
a = 5
print(a) # prints 5
fn()
print(a) # prints 3
Python3
# global variable
a = 3
def fn():
global a
# global variable modified
a = 5
print(a) # prints 5
print(a) # prints 5
fn()
Python3
def outer():
a = 5
def inner():
nonlocal a
a = 3
print(a) # prints 3
inner()
print(a) # prints 3
outer()
输出:
NameError: name 'a' is not defined
全局变量
变量是在任何函数之外定义的,并且可以在程序的任何地方访问。
Python3
# global variable
a = 3
def fn():
# print 3
print(a)
# print 3
print(a)
输出:
3
注意:有关更多信息,请参阅我们的Python中的全局和局部变量
当内部作用域中定义的变量与外部作用域中的变量同名时,就会发生变量阴影。考虑下面的示例,这里函数内部的变量与全局变量具有相同的名称。在这个程序中,变量 a 有两个版本,一个是全局定义的,另一个是在函数的上下文中定义的。 Python将这些变量视为完全独立的变量。全局变量 a 被局部变量 a 遮蔽。处理具有相同名称的外部和内部变量的方式取决于语言的名称解析规则。
Python3
# global variable
a = 3
def fn():
# local variable
a = 5
print(a) # prints 5
fn()
print(a) # prints 3
输出
5
3
如何避免变量阴影?
为了修改全局变量,避免变量遮蔽, Python提供了global关键字,它告诉Python使用变量的全局版本,而不是创建一个新的局部范围变量。
Python3
# global variable
a = 3
def fn():
global a
# global variable modified
a = 5
print(a) # prints 5
print(a) # prints 5
fn()
输出:
3
5
为了避免函数级别的变量隐藏,这意味着如果外部函数中的变量与内部函数中的变量具有相同的名称, Python提供了nonlocal关键字,它告诉Python使用外部函数中定义的变量,而不是创建一个新的局部范围变量
Python3
def outer():
a = 5
def inner():
nonlocal a
a = 3
print(a) # prints 3
inner()
print(a) # prints 3
outer()
输出:
3
3