Python 中的变量作用域决定了变量的可访问性和生命周期。作用域分为局部作用域和全局作用域。
1. 局部变量
局部变量是在函数内部定义的变量,其作用范围仅限于函数内部。函数执行结束后,局部变量会被销毁。
示例:
def my_function():x = 10 # 局部变量print("函数内部:", x)my_function()
# print(x) # 这行代码会报错,因为 x 是局部变量,在函数外部无法访问
2. 全局变量
全局变量是在函数外部定义的变量,其作用范围在整个程序中。全局变量可以在函数内部和外部访问和修改。
示例:
x = 10 # 全局变量def my_function():print("函数内部:", x)my_function()
print("函数外部:", x)
3. 修改全局变量
在函数内部修改全局变量时,需要使用 global
关键字声明该变量为全局变量。
示例:
x = 10 # 全局变量def my_function():global xx = 20 # 修改全局变量print("函数内部:", x)my_function()
print("函数外部:", x)
4. 嵌套函数中的作用域
在嵌套函数中,内部函数可以访问外部函数的局部变量,但不能直接修改。如果需要修改外部函数的局部变量,可以使用 nonlocal
关键字。
示例:
def outer_function():x = 10 # 外部函数的局部变量def inner_function():nonlocal xx = 20 # 修改外部函数的局部变量print("内部函数:", x)inner_function()print("外部函数:", x)outer_function()
5. LEGB 规则
Python 中的变量查找顺序遵循 LEGB 规则:
- Local(局部作用域):函数内部。
- Enclosing(嵌套作用域):外部嵌套函数。
- Global(全局作用域):函数外部。
- Built-in(内置作用域):Python 预定义的变量,如
len
、print
等。
示例:
x = "global"def outer_function():x = "enclosing"def inner_function():x = "local"print(x) # 输出: localinner_function()print(x) # 输出: enclosingouter_function()
print(x) # 输出: global
6. 可运行的Python案例
下面是一个完整的Python程序,演示了局部变量和全局变量的作用域,以及在嵌套函数中使用 nonlocal
关键字。
# 全局变量
x = "global"def outer_function():# 外部函数的局部变量x = "enclosing"def inner_function():# 内部函数的局部变量x = "local"print("内部函数:", x) # 输出: localinner_function()print("外部函数:", x) # 输出: enclosingouter_function()
print("全局作用域:", x) # 输出: globalprint("--- 修改全局变量 ---")def modify_global():global xx = "modified global"print("函数内部修改全局变量:", x)modify_global()
print("全局作用域:", x) # 输出: modified globalprint("--- 嵌套函数中修改局部变量 ---")def outer_function_with_nonlocal():x = "enclosing"def inner_function():nonlocal xx = "modified enclosing"print("内部函数:", x) # 输出: modified enclosinginner_function()print("外部函数:", x) # 输出: modified enclosingouter_function_with_nonlocal()
可以将上面的代码复制到你的IDE中运行,观察程序的输出。这个案例综合了局部和全局变量的基本知识,帮助你理解和掌握变量的作用域和LEGB规则。继续加油,学习Python会越来越有趣和有用!