Skip to content

Python 变量的作用域

在Python的世界里,每个变量都有一个明确的作用范围,我们称之为作用域 (scope)。 作用域决定了变量在程序的哪些部分可以被访问和使用。 理解作用域对于编写清晰、可维护的代码至关重要。

简单来说,作用域就像变量的“活动范围”,出了这个范围,变量就“失效”了。 Python 中主要有两种类型的变量,它们的作用域有所不同:

  • 局部变量 (Local Variables): 仅在函数或代码块内部有效。
  • 全局变量 (Global Variables): 可以在程序的任何地方访问。

接下来,我们将详细介绍这两种变量类型,并通过代码示例帮助你更好地理解。

局部变量:函数内部的秘密

局部变量就像函数内部的秘密,它们只能在定义它们的函数或代码块内部被访问。 也就是说,函数外部无法“看到”函数内部定义的局部变量。

局部变量只在函数执行期间存在。当函数执行完毕后,局部变量会被销毁,它们所占用的内存也会被释放。

示例代码

python
def triple(a):
    result = 3 * a
    # 变量 result 只能在函数内部访问
    print("函数内部:", result)

# 输出函数内部 result 的值
triple(3)

# 如果取消注释下一行,将会报错,因为 result 在函数 triple() 作用域之外不可访问
# print("函数外部:", result)

运行结果

函数内部: 9
# 如果取消注释 print("函数外部:", result),你会看到如下错误信息:
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# NameError: name 'result' is not defined

这个例子清楚地表明,变量 resulttriple() 函数的局部变量,只能在该函数内部使用。 如果在函数外部尝试访问它,Python 解释器会报错,提示 NameError

全局变量:程序的公共资源

全局变量是在任何函数或代码块之外定义的变量。 你可以把它们想象成程序的公共资源,可以在程序的任何地方被访问,包括函数内部和外部。

全局变量通常用于存储在程序的多个部分都需要使用的常量、配置信息或状态数据。

示例代码

python
n = 10  # 全局变量

def uno():
    print("uno 中的 n:", n)  # 访问全局变量 n

def tres():
    print("tres 中的 n*3:", n * 3)  # 访问全局变量 n

uno()
tres()

运行结果

uno 中的 n: 10
tres 中的 n*3: 30

在这个例子中,变量 n 是一个全局变量,可以在 uno()tres() 这两个函数中被访问和使用。

变量遮蔽 (Shadowing):同名变量的冲突

如果在函数内部定义了一个与全局变量同名的变量,那么在函数内部,这个局部变量会“遮蔽”全局变量。 这意味着,在函数内部对该变量的任何引用都将指向局部变量,而不是全局变量。

示例代码

python
n = 10  # 全局变量

# 函数内部的局部变量 n
def uno():
    n = 5  # 定义了一个新的局部变量 n,遮蔽了全局变量 n
    print("uno 中的局部变量 n:", n)

# 函数内部访问全局变量 n
def tres():
    print("tres 中的全局变量 n*3:", n * 3)

uno()
tres()
print("全局变量 n 仍然是:", n)  # 全局变量 n 未被 uno() 修改

运行结果

uno 中的局部变量 n: 5
tres 中的全局变量 n*3: 30
全局变量 n 仍然是: 10

从输出结果可以看出,在 uno() 函数内部,n 的值是 5,这是因为 uno() 函数定义了一个名为 n 的局部变量,它遮蔽了全局变量 n。 而在 tres() 函数和全局作用域中,n 的值仍然是 10,因为它们访问的是全局变量 n

global 关键字:修改全局变量的利器

如果你想在函数内部修改全局变量的值,你需要使用 global 关键字来声明该变量。 global 关键字告诉 Python 解释器,你想要访问的是全局变量,而不是创建一个新的局部变量。

示例代码

python
n = 10  # 全局变量

# 函数修改全局变量 n 的值
def uno():
    global n  # 声明 n 是全局变量
    n = 5  # 修改全局变量 n
    print("uno 修改后的全局变量 n:", n)

def tres():
    print("tres 中现在的全局变量 n*3:", n * 3)  # 使用修改后的全局变量 n

uno()
tres()
print("现在的全局变量 n 是:", n)

运行结果

uno 修改后的全局变量 n: 5
tres 中现在的全局变量 n*3: 15
现在的全局变量 n 是: 5

在这个例子中,uno() 函数使用 global n 声明 n 是全局变量,然后将它的值修改为 5。 这意味着,在 uno() 函数执行完毕后,全局变量 n 的值也会被修改为 5。

注意事项:避免过度使用 global

虽然 global 关键字可以让你在函数内部修改全局变量,但是过度使用它可能会导致代码难以理解和维护。 一般来说,最好尽量避免使用全局变量,而是通过函数参数和返回值来传递数据。 这样可以使代码更加模块化和可重用。

理解变量的作用域是编写高质量 Python 代码的关键。 记住以下几点:

  • 局部变量只能在定义它们的函数或代码块内部访问。
  • 全局变量可以在程序的任何地方访问。
  • 如果在函数内部定义了一个与全局变量同名的变量,那么局部变量会遮蔽全局变量。
  • 可以使用 global 关键字在函数内部修改全局变量的值。
  • 尽量避免过度使用 global 关键字,而是通过函数参数和返回值来传递数据。