Python 变量作用域
提示
- 局部变量的限制:在函数内部声明的变量(如
message
)只能在该函数内部访问。 - 全局变量的普遍性:在函数外部声明的变量(如
message = 'Hello'
)可以在整个程序中访问,包括函数内外。 - 非局部变量的特殊用途:在嵌套函数中,使用
nonlocal
关键字声明的变量既不局限于内部函数也不属于全局变量,可跨多层函数访问。
在 Python 中,我们可以在三个不同的作用域中声明变量:局部作用域、全局和非局部作用域。
变量作用域指定了我们可以访问变量的区域。例如,
def add_numbers():
sum = 5 + 4
这里,sum 变量在函数内部创建,因此只能在其内部访问(局部作用域)。这种类型的变量称为局部变量。
根据作用域,我们可以将 Python 变量分为三种类型:
- 局部变量
- 全局变量
- 非局部变量
Python 局部变量
当我们在函数内部声明变量时,这些变量将具有局部作用域(在函数内部)。我们无法在函数外部访问它们。
这些类型的变量称为局部变量。例如,
def greet():
# 局部变量
message = 'Hello'
print('Local', message)
greet()
# 尝试在 greet() 函数外部访问 message 变量
print(message)
输出
Local Hello
NameError: name 'message' is not defined
这里,message 变量是 greet()
函数的局部变量,因此只能在函数内部访问。
这就是为什么我们在尝试在 greet()
函数外部访问它时会出错。
为了解决这个问题,我们可以将名为 message 的变量声明为全局变量。
Python 全局变量
在 Python 中,函数外部或全局作用域内声明的变量被称为全局变量。这意味着全局变量可以在函数内部或外部访问。
让我们看一个 Python 中创建全局变量的例子。
# 声明全局变量
message = 'Hello'
def greet():
# 声明局部变量
print('Local', message)
greet()
print('Global', message)
输出
Local Hello
Global Hello
这次我们可以从 greet()
函数外部访问 message 变量。这是因为我们已经将 message 变量创建为全局变量。
# 声明全局变量
message = 'Hello'
现在,message 将可以在程序的任何作用域(区域)内被访问。
Python 非局部变量
在 Python 中,非局部变量用于嵌套函数中未定义其局部作用域的情况。这意味着变量既不在局部作用域也不在全局作用域中。
我们使用 nonlocal
关键字来创建非局部变量。例如,
# 外部函数
def outer():
message = 'local'
# 嵌套函数
def inner():
# 声明非局部变量
nonlocal message
message = 'nonlocal'
print("inner:", message)
inner()
print("outer:", message)
outer()