python变量动态创建且类型由值决定,命名须符合规则:仅含字母、数字、下划线,不以数字开头,不能是关键字或内置函数名;区分大小写;支持类型提示但不强制运行时检查。

Python 变量不需要声明类型,但命名必须符合规则
Python 没有 int x = 5 或 var name 这类声明语法——变量在首次赋值时自动创建,类型由值决定。这不等于“随便起名”,name、_count、MAX_SIZE 都合法,但 2nd_item、class、user-name 会直接报错。
常见错误现象:SyntaxError: invalid decimal literal(以数字开头)、SyntaxError: invalid syntax(用了连字符或空格)、TypeError 或 NameError(误用关键字如 def、return 作变量名)。
- 变量名只能含字母、数字、下划线,且不能以数字开头
- 不能是 Python 关键字:可用
import keyword; keyword.kwlist查看当前版本全部列表 - 区分大小写:
total和Total是两个变量 - 避免和内置函数同名,比如
list、str、id——后续调用list()会报TypeError: 'list' object is not callable
动态类型意味着同一变量可反复绑定不同类型的值
变量只是名字,背后是对象的引用。赋值 x = 42 后再执行 x = "hello",不是“类型变了”,而是 x 指向了一个新字符串对象,整数对象若无其他引用会被回收。
使用场景:写脚本快速处理数据时很灵活;但在函数接口、团队协作或长期维护项目中,这种自由容易埋坑。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 调试困难:某处
data原本是dict,后来被意外赋值为None,下游data.keys()就抛AttributeError - IDE 和类型检查工具(如 mypy)无法可靠推断类型,除非加类型注解
- 性能上无实质影响——类型判断发生在运行时,但频繁切换大对象(如从
list改成numpy.ndarray)可能触发额外内存分配
给变量加类型提示(type hint)不是声明,但能显著减少误用
def process(items: list[str]) -> dict[str, int]: 这类注解不会改变运行行为,Python 解释器完全忽略它们。但它让 IDE 能预警 items.append(42)(期望 str),也让 mypy 在命令行跑一遍就能发现多数类型错配。
注意:类型提示本身也受动态特性约束——你可以写 age: int = "twenty",代码照样运行,直到你主动用工具检查。
- 基础类型直接写:
name: str、active: bool、score: float - 容器类型用
typing模块(Python 3.9+ 可用内置list[str]等) - 可选值写成
Optional[str]或str | None(推荐后者,更简洁) - 函数参数默认不强制校验,需配合
mypy或 IDE 插件才生效
全局变量与局部变量混淆是 runtime 错误高发区
函数内给变量赋值(如 counter = counter + 1),若未声明 global counter,Python 默认当作新建局部变量。此时如果 counter 在外层存在,就会触发 UnboundLocalError: local variable 'counter' referenced before assignment。
这不是命名不规范的问题,而是作用域规则和动态赋值共同导致的典型陷阱。
- 只读访问外层变量无需声明:
print(counter)没问题 - 只要出现赋值符号(
=、+=等),Python 就认定该变量在当前作用域为局部,除非显式写global或nonlocal - 类内部的实例变量(
self.name)不受此限,因为self是明确传入的参数 - 避免依赖全局状态,优先用函数参数传递数据——更易测试,也绕开这个坑
user_id: int = get_id() 却在下一行改成 user_id = "U-123"——那注解就失去了意义。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










