在 Python 中,全局变量和局部变量是两种不同的变量类型,它们的作用范围和生命周期有所不同。了解它们的区别对于编写和调试 Python 代码至关重要。下面是对全局变量和局部变量的详细解释。

1. 局部变量

定义: 局部变量是在函数或方法内部定义的变量,仅在该函数或方法的作用范围内可见和可访问。

作用范围: 仅限于定义它们的函数或方法内。

生命周期: 当函数或方法执行时,局部变量被创建。当函数或方法执行完毕时,局部变量会被销毁。

示例:

def my_function():
    local_var = 10  # 局部变量
    print(local_var)

my_function()
# print(local_var)  # 这行会报错,因为 local_var 在函数外不可见

在上面的例子中,local_var 是一个局部变量,只能在 my_function 函数内部访问。

2. 全局变量

定义: 全局变量是在函数或方法之外定义的变量,在整个模块(文件)范围内可见和可访问。

作用范围: 在整个模块中都可见,包括函数和类内部。

生命周期: 从定义开始,直到程序终止或重新赋值。

示例:

global_var = 20  # 全局变量

def my_function():
    print(global_var)

my_function()  # 输出 20
print(global_var)  # 输出 20

在这个例子中,global_var 是一个全局变量,可以在模块的任何地方访问。

3. 修改全局变量

在函数内部修改全局变量时,需要使用 global 关键字来声明你打算修改的是全局变量,而不是创建一个新的局部变量。

示例:

global_var = 30

def modify_global():
    global global_var
    global_var = 40

modify_global()
print(global_var)  # 输出 40

如果不使用 global 关键字,Python 会假设你是在函数内部创建一个新的局部变量,而不会修改全局变量。

示例:

global_var = 50

def modify_global():
    global_var = 60  # 创建了一个新的局部变量,而不是修改全局变量

modify_global()
print(global_var)  # 输出 50,因为全局变量没有被修改

4. 变量作用域

局部作用域: 变量在函数内定义,只有在函数内可用。

全局作用域: 变量在函数外定义,整个模块范围内可用。

嵌套作用域: 在函数内部定义的函数(嵌套函数)可以访问外部函数的局部变量。

示例:

def outer_function():
    outer_var = 70

    def inner_function():
        print(outer_var)  # 可以访问 outer_var

    inner_function()

outer_function()

在这个例子中,inner_function 可以访问 outer_function 中定义的 outer_var 变量。

5. 使用 nonlocal 关键字

nonlocal 关键字用于在嵌套函数中修改外层(非全局)变量。

示例:

def outer_function():
    outer_var = 80

    def inner_function():
        nonlocal outer_var
        outer_var = 90

    inner_function()
    print(outer_var)  # 输出 90

outer_function()

在这个例子中,nonlocal 关键字用于在 inner_function 中修改 outer_var,这是 outer_function 的局部变量。

总结

  • 局部变量 只能在定义它的函数或方法内部访问。
  • 全局变量 在整个模块内都可见,包括函数和方法。
  • 使用 global 关键字可以在函数内部修改全局变量。
  • 使用 nonlocal 关键字可以在嵌套函数中修改外层函数的局部变量。