Python变量的作用域

从变量的作用域角度来看,Python 中的变量可以分为以下几类:全局变量局部变量非局部变量内建变量。这些分类主要与变量的可见范围生命周期有关。



1. 全局变量 (Global Variables)

  • 定义:在函数或类的外部定义的变量,作用域是整个模块(文件)。它们可以在模块内的所有函数中被访问,但如果需要在函数中修改,必须显式声明为 global
  • 作用域:模块级别,跨函数和类。
  • 生命周期:程序运行期间始终存在,直到程序结束。

示例:

x = 42  # 全局变量

def print_global():
    print(x)  # 可以直接访问全局变量

def modify_global():
    global x
    x = 100  # 修改全局变量

print_global()  # 输出:42
modify_global()
print_global()  # 输出:100


2. 局部变量 (Local Variables)

  • 定义:在函数内部定义的变量,仅在函数内部有效。
  • 作用域:函数内部。
  • 生命周期:变量在函数调用时创建,函数执行完毕后销毁。

示例:

def example():
    y = 10  # 局部变量
    print(y)

example()  # 输出:10
# print(y)  # 报错:NameError,因为 y 只在函数内部有效


3. 非局部变量 (Nonlocal Variables)

  • 定义:指外部嵌套函数中的局部变量,可以通过 nonlocal 关键字在内部函数中修改这些变量。
  • 作用域:嵌套函数之间(函数闭包中)。
  • 生命周期:随着外层函数的生命周期而存在。

示例:

def outer():
    a = 5  # 外层函数的局部变量

    def inner():
        nonlocal a
        a = 10  # 修改外层函数的局部变量
        print("Inner:", a)

    inner()
    print("Outer:", a)

outer()
# 输出:
# Inner: 10
# Outer: 10


4. 内建变量 (Built-in Variables)

  • 定义:由 Python 解释器内建的变量和函数,作用域是整个程序。
  • 作用域:全局,优先级最低。
  • 生命周期:程序运行期间始终存在。

Python 的内建命名空间可以通过 dir(__builtins__) 查看,常见的内建变量包括:

  • 函数:len(), max(), min(), print() 等。
  • 异常类:Exception, ValueError 等。
  • 常量:True, False, None

示例:

print(len([1, 2, 3]))  # 使用内建函数 len()


5. 作用域解析规则 (LEGB)

Python 的变量作用域遵循 LEGB 规则

  1. Local (局部作用域) 当前函数或代码块内部的变量。
  2. Enclosing (闭包外层作用域) 外层函数的局部作用域(针对嵌套函数)。
  3. Global (全局作用域) 模块级别的变量,当前模块中的全局变量。
  4. Built-in (内建作用域) Python 内建命名空间中的变量。

示例:

x = "global"

def outer():
    x = "enclosing"
    def inner():
        x = "local"
        print(x)  # 输出:local
    inner()
    print(x)  # 输出:enclosing

outer()
print(x)  # 输出:global


6. 全局变量与局部变量的冲突

如果局部变量和全局变量同名,函数内部优先使用局部变量。

示例:

x = 10  # 全局变量

def example():
    x = 20  # 局部变量,屏蔽全局变量
    print(x)

example()  # 输出:20
print(x)  # 输出:10

要在函数中显式修改全局变量,需使用 global

x = 10

def example():
    global x
    x = 20  # 修改全局变量

example()
print(x)  # 输出:20


7. 嵌套作用域中的变量修改

使用 nonlocal 修改闭包外层的变量:

def outer():
    x = 10

    def inner():
        nonlocal x
        x = 20  # 修改外层变量

    inner()
    print(x)

outer()  # 输出:20


总结

类型定义位置可见范围修改方式
全局变量函数或类外部模块内所有代码使用 global
局部变量函数内部当前函数内部直接修改
非局部变量外层嵌套函数的局部变量嵌套函数之间使用 nonlocal
内建变量Python 内建命名空间全局可见不可修改

Python 中的作用域控制简单且灵活,但需要合理管理,避免变量命名冲突。


文章标签:

评论(0)