在 Python 中,变量、常量、全局变量等是编程的基本概念,它们用于存储和管理数据。下面详细介绍它们的用法和区别。
1. 变量(Variable)
变量用于存储数据,其值可以随时修改。
特点
-
使用
=
赋值 -
变量名区分大小写(如
name
和NAME
不同) -
无需声明类型(动态类型语言)
-
可以重新赋值
x = 10 # 整数变量
name = "Alice" # 字符串变量
is_active = True # 布尔变量
x = 20 # 变量可以重新赋值
命名规则
-
由字母、数字、下划线
_
组成 -
不能以数字开头(如
1var
❌) -
避免使用 Python 关键字(如
if
,for
,class
❌)
2. 常量(Constant)
Python 没有真正的常量,但约定用全大写变量名表示“常量”,表示不应修改。
特点
-
通常定义在模块顶层
-
命名全部大写(如
PI
,MAX_SIZE
) -
逻辑上不可变(但 Python 不强制)
PI = 3.14159 # 常量(约定)
MAX_USERS = 1000 # 常量(约定)
# 虽然可以修改,但不推荐
PI = 3.14 # ❌ 违反约定
3. 全局变量(Global Variable)
全局变量在整个模块(文件)中可用,函数内部访问需用 global
声明。
特点
-
定义在函数外部
-
函数内修改需
global
声明 -
滥用全局变量可能导致代码难以维护
示例
count = 0 # 全局变量
def increment():
global count # 声明使用全局变量
count += 1
increment()
print(count) # 输出 1
避免滥用全局变量
# 不推荐:过多全局变量
x = 10
y = 20
z = 30
# 推荐:用类或函数封装
class Config:
X = 10
Y = 20
Z = 30
4. 局部变量(Local Variable)
局部变量仅在函数或代码块内部有效。
特点
-
定义在函数内部
-
函数外无法访问
-
生命周期仅限于函数执行期间
def greet():
message = "Hello" # 局部变量
print(message)
greet() # 输出 "Hello"
print(message) # ❌ 报错:message 未定义
5. 非局部变量(Nonlocal Variable)
用于嵌套函数中,修改外层(非全局)变量。
特点
-
用于闭包或嵌套函数
-
使用
nonlocal
声明 -
比
global
更安全
def outer():
x = 10 # 外层变量
def inner():
nonlocal x # 声明修改外层变量
x = 20
inner()
print(x) # 输出 20
outer()
6. 变量作用域优先级
Python 变量查找顺序(LEGB 规则):
-
L(Local):局部作用域(函数内部)
-
E(Enclosing):嵌套函数的外层作用域
-
G(Global):全局作用域(模块级别)
-
B(Built-in):内置作用域(如
print
,len
)
x = "global" # 全局变量
def outer():
x = "outer" # 嵌套作用域
def inner():
x = "inner" # 局部变量
print(x) # 输出 "inner"
inner()
print(x) # 输出 "outer"
outer()
print(x) # 输出 "global"
总结
类型 | 定义位置 | 作用域 | 是否可变 | 示例 |
---|---|---|---|---|
变量 | 任意位置 | 取决于定义位置 | ✅ | x = 10 |
常量 | 模块顶层(约定) | 全局 | ❌(约定) | PI = 3.14 |
全局变量 | 模块顶层 | 全局 | ✅ | count = 0 |
局部变量 | 函数内部 | 函数内 | ✅ | def f(): x = 1 |
非局部变量 | 嵌套函数 | 外层函数 | ✅ | nonlocal x |
最佳实践:
-
尽量使用局部变量,避免全局变量
-
常量用全大写命名(如
MAX_SIZE
) -
需要跨函数共享数据时,考虑用类或返回值传递