Python变量的作用域
已于 2025年01月15日 14:30 修改
访问次数:34
从变量的作用域角度来看,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 规则:
- Local (局部作用域) 当前函数或代码块内部的变量。
- Enclosing (闭包外层作用域) 外层函数的局部作用域(针对嵌套函数)。
- Global (全局作用域) 模块级别的变量,当前模块中的全局变量。
- 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)