7.1 局部变量与全局变量
在 Python 中,变量的作用域决定了它在程序中的可见性和生命周期。局部变量是在函数内部定义的变量,只能在该函数内部访问;而全局变量是在函数外部定义的变量,可以在整个程序中访问。
让我们通过一个简单的例子来理解:
# 定义一个全局变量
global_var = "我是全局变量"
def my_function():
# 定义一个局部变量
local_var = "我是局部变量"
print(local_var) # 可以访问局部变量
print(global_var) # 也可以访问全局变量
my_function()
print(global_var) # 可以访问全局变量
# print(local_var) # 这行会报错,因为局部变量在函数外部不可见在这个例子中,global_var 是全局变量,可以在函数内外访问;而 local_var 是局部变量,只能在 my_function 函数内部访问。
局部变量和全局变量的主要区别在于它们的作用域和生命周期。局部变量在函数调用时创建,在函数返回时销毁;而全局变量在整个程序运行期间都存在。
7.2 global 关键字使用
有时候,我们可能需要在函数内部修改全局变量的值。这时候就需要使用 global 关键字来声明我们要使用的是全局变量,而不是创建一个新的局部变量。
# 定义一个全局变量
counter = 0
def increment():
global counter # 声明使用全局变量 counter
counter += 1 # 修改全局变量的值
print(f"计数器值: {counter}")
increment() # 输出: 计数器值: 1
increment() # 输出: 计数器值: 2
print(f"全局计数器值: {counter}") # 输出: 全局计数器值: 2如果没有使用 global 关键字,Python 会认为我们在函数内部创建了一个新的局部变量 counter,而不是修改全局变量。
需要注意的是,过度使用全局变量可能会导致代码难以维护和调试,因为它使得函数之间的依赖关系变得不清晰。在实际开发中,应该尽量减少全局变量的使用。
7.3 闭包的基本概念
闭包(Closure)是函数式编程中的重要概念,也是学习装饰器前的必要铺垫。
什么是闭包? 如果一个内部函数引用了外部函数的变量,并且外部函数将这个内部函数作为返回值返回,那么这个内部函数就称为闭包。
构成闭包的三个条件:
- 有函数嵌套(外部函数包裹内部函数)。
- 内部函数引用了外部函数的变量(非全局变量)。
- 外部函数将内部函数作为返回值返回。
基本示例
def outer(x):
def inner(y):
return x + y
return inner
add_10 = outer(10)
print(add_10(5)) # 15
print(add_10(20)) # 30闭包会“记住”创建它时的外部变量 x。
常见应用:函数工厂
def multiply_by(n):
def multiplier(x):
return x * n
return multiplier
double = multiply_by(2)
triple = multiply_by(3)
print(double(5)) # 10
print(triple(5)) # 15修改外部变量:nonlocal 内部函数默认不能修改外部变量,若需修改,必须用 nonlocal 关键字声明。
def counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
c = counter()
print(c()) # 1
print(c()) # 2闭包的主要用途
- 数据封装:将状态隐藏起来,只返回可操作的函数。
- 装饰器基础:装饰器本质上就是接受函数作为参数并返回闭包。
- 回调函数:传递带有“记忆”的函数。
7.4 nonlocal 关键字作用
nonlocal 关键字用于在嵌套函数中修改外层(非全局)作用域中的变量。它与 global 关键字类似,但 global 用于修改全局变量,而 nonlocal 用于修改外层函数的局部变量。
def outer_function():
"""外部函数"""
x = 10 # 外层函数的局部变量
def inner_function():
"""内部函数"""
nonlocal x # 声明使用外层函数的变量 x
x = 20 # 修改外层函数的变量
print(f"内部函数中的 x: {x}")
print(f"调用内部函数前的 x: {x}")
inner_function()
print(f"调用内部函数后的 x: {x}")
outer_function()
# 输出:
# 调用内部函数前的 x: 10
# 内部函数中的 x: 20
# 调用内部函数后的 x: 20如果没有使用 nonlocal 关键字,内部函数会创建一个新的局部变量 x,而不会修改外层函数的 x。
nonlocal 关键字只能用于嵌套函数中,不能用于修改全局变量。如果要修改全局变量,还是需要使用 global 关键字。
这些作用域相关的概念虽然看起来有点复杂,但它们是理解 Python 函数和变量行为的基础。掌握好这些知识,会让你写出更清晰、更可靠的代码。