跳到主要内容

Python 变量作用域

提示
  1. 局部变量的限制:在函数内部声明的变量(如 message)只能在该函数内部访问。
  2. 全局变量的普遍性:在函数外部声明的变量(如 message = 'Hello')可以在整个程序中访问,包括函数内外。
  3. 非局部变量的特殊用途:在嵌套函数中,使用 nonlocal 关键字声明的变量既不局限于内部函数也不属于全局变量,可跨多层函数访问。

在 Python 中,我们可以在三个不同的作用域中声明变量:局部作用域、全局和非局部作用域。

变量作用域指定了我们可以访问变量的区域。例如,

def add_numbers():
sum = 5 + 4

这里,sum 变量在函数内部创建,因此只能在其内部访问(局部作用域)。这种类型的变量称为局部变量。

根据作用域,我们可以将 Python 变量分为三种类型:

  1. 局部变量
  2. 全局变量
  3. 非局部变量

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()

输出

inner: nonlocal
outer: nonlocal

在上面的例子中,有一个嵌套的 inner() 函数。我们使用了 nonlocal 关键字来创建一个非局部变量。

inner() 函数定义在另一个函数 outer() 的作用域中。

注意:如果我们改变非局部变量的值,这些改变会出现在局部变量中。