浏览知识库目录

Python

语法、对象与数据类型

从名称绑定、身份、相等性和可变性理解 Python 对象模型及常用基础类型。

语法、对象与数据类型

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("任务标题不能为空")

andor 返回参与运算的对象,不一定返回 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,推断值相等。


十、练习与自测

  1. 编写 normalize_title(value),拒绝非字符串和空白标题。
  2. 用整数分表示任务预算,并格式化为两位小数。
  3. 创建嵌套列表,比较赋值、浅复制和深复制的差异。

自测:

  • is== 的边界是什么?
  • 为什么 bool("false") 为真?
  • 修改共享列表为什么会影响另一个名称?

十一、官方资料

上一篇:环境、解释器与项目基线 | 下一篇:内置容器与推导式