Python
语法、对象与数据类型
从名称绑定、身份、相等性和可变性理解 Python 对象模型及常用基础类型。
发布于 2026年7月24日
语法、对象与数据类型
Python 变量保存的不是“装有值的盒子”,而是指向对象的名称。理解名称绑定、对象身份和可变性,可以解释大量看似意外的行为。
一、学习目标
- 理解名称绑定与动态、强类型
- 区分对象身份、相等性和真值
- 掌握数字、字符串、字节与
None - 识别可变默认值和共享引用问题
- 为任务数据建立第一版表示
二、名称绑定
title = "阅读 Python 文档"
alias = title
print(title is alias)
print(title == alias)
= 把名称绑定到对象,不会声明一个固定类型的存储槽。名称之后可以重新绑定:
count = 3
count = "three"
这是动态类型;但 Python 不会随意把不相关类型自动相加:
1 + "2" # TypeError
因此它同时是强类型语言。
三、身份与相等
is比较是否为同一个对象。==比较对象定义的值是否相等。
first = ["read", "test"]
second = ["read", "test"]
print(first == second) # True
print(first is second) # False
None 是单例,使用身份判断:
due_at = None
if due_at is None:
print("未设置截止时间")
不要用 is 比较字符串或整数。解释器可能复用某些对象,但这不是业务契约。
四、可变与不可变对象
常见不可变对象包括整数、浮点数、布尔值、字符串、字节和元组;常见可变对象包括列表、字典和集合。
tasks = ["阅读"]
same_tasks = tasks
tasks.append("测试")
print(same_tasks) # ['阅读', '测试']
两个名称指向同一个列表,所以原地修改对双方可见。要复制一层:
copied_tasks = tasks.copy()
copied_tasks.append("发布")
浅复制只复制最外层容器。存在嵌套可变对象时,需要重新设计数据结构或明确使用 copy.deepcopy。
五、数字和布尔值
completed = 7
total = 10
ratio = completed / total
percent = round(ratio * 100, 1)
print(f"完成率:{percent}%")
/ 始终产生浮点除法,// 是向下取整除法,% 求余,** 求幂。
浮点数不适合直接表示精确金额:
print(0.1 + 0.2 == 0.3) # False
金额可使用整数最小单位或 decimal.Decimal。
from decimal import Decimal
price = Decimal("19.99")
count = Decimal("3")
total = price * count
print(total) # 59.97
布尔值是整数的子类,但业务模型中不要用 0/1 替代清晰的布尔字段或枚举。
六、字符串、字节与格式化
task_id = 42
title = "修复导入错误"
message = f"#{task_id}: {title}"
字符串是 Unicode 文本;bytes 是字节序列。文件或网络边界需要显式编码:
payload = message.encode("utf-8")
restored = payload.decode("utf-8")
assert restored == message
不要把字节和字符串混合拼接。文本进入外部系统时编码,离开外部系统时解码。
Python 3.14 新增模板字符串字面量(t-string)。它返回可供程序安全处理的模板对象,而不是直接完成插值。普通展示仍优先使用 f-string;需要自定义转义或结构化处理时再研究 t-string。
七、真值与短路
空字符串、空容器、数值零、None 的真值为假:
title = " "
if not title.strip():
raise ValueError("任务标题不能为空")
and 和 or 返回参与运算的对象,不一定返回 bool:
configured = ""
database = configured or "tasks.db"
默认值写法很简洁,但要确认 0、空列表等合法值是否会被错误替换。
八、任务的第一版表示
task = {
"id": 1,
"title": "阅读 Python 文档",
"status": "todo",
}
task["title"] = task["title"].strip()
if not task["title"]:
raise ValueError("任务标题不能为空")
字典适合探索数据形状,但字段增多后容易产生拼写错误。后续会将它替换为 dataclass。
九、常见错误
链式赋值得到共享列表
todo = done = []
todo.append("阅读")
print(done) # ['阅读']
应分别创建:
todo: list[str] = []
done: list[str] = []
把外部输入直接当布尔值
bool("false") # True
非空字符串都为真。应显式解析允许值。
依赖对象驻留
不要根据小整数或短字符串偶尔满足 is,推断值相等。
十、练习与自测
- 编写
normalize_title(value),拒绝非字符串和空白标题。 - 用整数分表示任务预算,并格式化为两位小数。
- 创建嵌套列表,比较赋值、浅复制和深复制的差异。
自测:
is与==的边界是什么?- 为什么
bool("false")为真? - 修改共享列表为什么会影响另一个名称?
十一、官方资料
上一篇:环境、解释器与项目基线 | 下一篇:内置容器与推导式