在 Python 编程中,变量的作用域(局部 / 全局)是函数与模块化开发的核心基础,直接影响代码的可读性、可维护性和执行逻辑。本文从作用域规则、变量交互方式、常见陷阱及模块化场景下的最佳实践展开,结合实战示例深度解析局部与全局变量的核心知识点。

一、核心概念:作用域与变量分类

1.1 变量作用域的定义

变量的作用域指 “变量能被访问 / 修改的代码范围”,Python 中最核心的两类作用域对应局部变量和全局变量:

类型定义场景访问范围生命周期
全局变量函数 / 类外部定义整个程序(所有函数 / 模块均可访问)程序启动至结束
局部变量函数 / 类方法 / 代码块内部仅定义它的函数 / 代码块内部函数调用时创建,调用结束销毁

1.2 作用域的底层规则:LEGB 原则

Python 解析变量时遵循LEGB 优先级顺序,从内到外查找:

  • L(Local):当前函数 / 代码块的局部作用域;
  • E(Enclosing):嵌套函数中的外层(闭包)作用域;
  • G(Global):模块级的全局作用域;
  • B(Built-in):Python 内置的关键字 / 函数(如print/len)。

示例:LEGB 规则验证

python

# G(全局)
global_var = "全局变量"

def outer_func():
    # E(闭包外层)
    enclosing_var = "闭包变量"
    def inner_func():
        # L(局部)
        local_var = "局部变量"
        # 查找顺序:local → enclosing → global → built-in
        print(local_var)    # 局部变量(L)
        print(enclosing_var)# 闭包变量(E)
        print(global_var)   # 全局变量(G)
        print(len)          # 内置函数(B)
    inner_func()

outer_func()

二、局部变量:函数内的 “私有” 变量

2.1 局部变量的特性

  1. 自动创建与销毁:函数调用时分配内存,调用结束后立即释放,不占用全局资源;
  2. 作用域隔离:不同函数的局部变量相互独立,同名变量不会冲突;
  3. 优先级最高:函数内若定义了与全局变量同名的局部变量,优先使用局部版本。

示例:局部变量的隔离性

python

def func1():
    num = 10  # func1的局部变量
    print(num)  # 输出:10

def func2():
    num = 20  # func2的局部变量(与func1同名但不冲突)
    print(num)  # 输出:20

func1()
func2()

2.2 局部变量的限制

  • 局部变量无法被函数外部访问;
  • 函数内默认无法修改全局变量(直接赋值会被识别为 “创建局部变量”)。

错误示例:函数内误改全局变量

python

count = 0  # 全局变量

def add_count():
    count += 1  # 报错:UnboundLocalError(Python认为count是局部变量,但未定义)
    print(count)

add_count()

三、全局变量:跨函数的 “公共” 变量

3.1 全局变量的定义与访问

全局变量定义在所有函数外部,可被程序内所有函数直接读取(无需额外声明)。

示例:全局变量的读取

python

# 全局变量
PI = 3.14159
user_name = "Pythoner"

def calculate_circle(r):
    # 直接访问全局变量PI
    return PI * r * r

def print_info():
    # 直接访问全局变量user_name
    print(f"用户名:{user_name}")

print(calculate_circle(2))  # 输出:12.56636
print_info()                # 输出:用户名:Pythoner

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

若需在函数内修改全局变量(而非创建局部变量),需用global声明变量为 “全局变量”。

正确示例:用global修改全局变量

python

count = 0  # 全局变量

def add_count():
    global count  # 声明:使用的是全局变量count
    count += 1
    print(count)  # 输出:1

add_count()
print(count)     # 输出:1(全局变量已被修改)

3.3 global关键字的使用规则

  1. global声明需放在函数内变量使用之前;
  2. 可同时声明多个全局变量:global a, b, c
  3. global仅作用于当前函数,嵌套函数需单独声明。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐