Slashrun
100.37M · 2026-04-09
Python 查找变量时遵循 LEGB 规则,按以下顺序搜索:
# 全局变量
x = "global"
def outer():
# 嵌套作用域
x = "enclosing"
def inner():
# 局部作用域
x = "local"
print(f"inner: {x}")
inner()
print(f"outer: {x}")
outer()
print(f"global: {x}")
# 输出:
# inner: local
# outer: enclosing
# global: global
用于在函数内部修改全局变量:
count = 0
def increment():
global count
count += 1
print(f"Count: {count}")
increment() # Count: 1
increment() # Count: 2
print(f"Final: {count}") # Final: 2
用于在嵌套函数中修改外层函数的变量:
def make_counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
counter = make_counter()
print(counter()) # 1
print(counter()) # 2
print(counter()) # 3
闭包是指一个函数对象,它可以访问并"记住"其定义时的外部作用域中的变量,即使外部函数已经执行完毕。
def make_multiplier(factor):
"""创建一个乘法器闭包"""
def multiply(number):
return number * factor
return multiply
# 创建不同的乘法器
double = make_multiplier(2)
triple = make_multiplier(3)
print(double(5)) # 10
print(triple(5)) # 15
print(double(10)) # 20
def timer_decorator(func):
"""简单的计时装饰器"""
import time
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 执行时间:{end - start:.4f}秒")
return result
return wrapper
@timer_decorator
def slow_function():
total = 0
for i in range(1000000):
total += i
return total
result = slow_function()
print(f"结果:{result}")
# 错误示例
functions = []
for i in range(3):
functions.append(lambda: i)
print([f() for f in functions]) # [2, 2, 2] - 都是 2!
# 正确示例:使用默认参数绑定
functions = []
for i in range(3):
functions.append(lambda x=i: x)
print([f() for f in functions]) # [0, 1, 2] - 正确!
# 或使用闭包
functions = []
for i in range(3):
def make_func(val):
return lambda: val
functions.append(make_func(i))
print([f() for f in functions]) # [0, 1, 2] - 正确!
def create_cache():
"""创建一个带缓存功能的函数"""
cache = {}
def get_or_compute(key, compute_func):
if key not in cache:
print(f"计算 {key}...")
cache[key] = compute_func()
else:
print(f"从缓存获取 {key}")
return cache[key]
return get_or_compute
# 使用缓存
cache = create_cache()
def expensive_compute():
return sum(range(1000000))
print(cache("sum", expensive_compute)) # 首次计算
print(cache("sum", expensive_compute)) # 从缓存获取
def count_calls(func):
"""统计函数调用次数的装饰器"""
count = 0
def wrapper(*args, **kwargs):
nonlocal count
count += 1
print(f"{func.__name__} 被调用 {count} 次")
return func(*args, **kwargs)
wrapper.call_count = lambda: count
return wrapper
@count_calls
def greet(name):
return f"Hello, {name}!"
print(greet("Alice"))
print(greet("Bob"))
print(f"总调用次数:{greet.call_count()}")
Python 允许我们检查函数的闭包内容:
def outer(x):
def inner(y):
return x + y
return inner
closure_func = outer(10)
# 查看闭包信息
print(f"闭包变量数:{len(closure_func.__closure__)}")
print(f"闭包值:{closure_func.__closure__[0].cell_contents}")
print(f"调用结果:{closure_func(5)}") # 15
| 概念 | 用途 | 关键字 |
|---|---|---|
| 局部作用域 | 函数内部变量 | - |
| 全局作用域 | 模块级变量 | global |
| 嵌套作用域 | 外层函数变量 | nonlocal |
| 闭包 | 保持状态、工厂函数 | - |
核心要点:
global 或 nonlocal