Python中的变量与常量

Python无语法常量,变量动态可变且类型由值决定;常量靠全大写命名约定、模块级定义及工具检查实现,不可变对象不等于常量。

Python中没有语法层面的“常量”概念,所有变量都可重新赋值;但通过命名约定和编程规范,可以清晰地区分哪些变量应被视为常量。

变量:动态、可变、无需声明类型

Python变量本质上是对象的引用,赋值即绑定名称到对象。变量不需要提前声明类型,类型由所赋的值决定,且可在运行时改变。

  • 赋值即创建:第一次给名字赋值(如 x = 10)就创建了变量 x,指向整数对象 10
  • 类型动态变化:后续可赋不同类型的值(x = "hello"),x 就转而引用字符串对象
  • 内存自动管理:当变量不再被引用,对应对象可能被垃圾回收,无需手动释放

常量:靠约定,非强制,靠自律与工具辅助

Python不提供 constfinal 关键字。所谓“常量”,是开发者约定俗成地用全大写加下划线命名,并在逻辑上保证其值不被修改。

  • 命名规范:如 PI = 3.14159MAX_RETRY = 3DATABASE_URL = "sqlite:///app.db"
  • 模块级惯例:通常把常量集中定义在模块顶层(如 config.py),方便复用和统一管理
  • 静态检查支持:工具如 pylint 可检测对全大写变量的意外重新赋值(提示 C0103W0622),增强约束力

进阶做法:模拟不可变常量(谨慎使用)

若需更强的保护,可通过技术手段限制修改,但会增加复杂度,一般项目中不推荐过度使用。

立即学习“Python免费学习笔记(深入)”;

  • 使用 @property + 私有属性:在类中封装,只提供只读访问接口
  • 冻结数据类(from dataclasses import dataclass + frozen=True:适合一组相关常量组成的结构体
  • 自定义模块 __setattr__:极少数场景下重写模块级属性设置逻辑(易出错,维护成本高)

关键提醒:别混淆“不可变对象”与“常量”

字符串、元组、数字等是不可变对象(immutable),但这不等于它们是常量——你仍可让变量指向新对象:

  • name = "Alice" → 后续 name = "Bob" 是合法的(只是换了个引用)
  • t = (1, 2)t = (3, 4) 也完全没问题;真正不可变的是元组内容,不是变量本身