3. 内置类型
解释器内置的标准类型总览:真值与比较、数字与序列、文本与二进制、映射与集合、迭代与注解等;每节表格导读,细节以官方 stdtypes 为准。
本章对应标准库里对内置类型的集中说明:数字、序列、映射、类与实例、异常等;许多「多项集」操作会原地修改可变对象并返回 None,与链式返回新数组的 JS 习惯不同。
| 类别 | 典型类型 | 要点 |
|---|
| 不可变 | int、float、complex、str、bytes、tuple、frozenset、固定内容的 range 视图等 | 运算产生新对象;可作 dict 键的需可哈希(见官方「数字类型的哈希运算」等)。 |
| 可变 | list、dict、set、bytearray(及 memoryview 的某些用法) | 原地 append、pop、update 等返回 None,不返回容器自身。 |
默认对象为真,除非类定义 __bool__ 返回假值或 __len__ 返回 0。内置假值大致如下:
| 假值对象 | 说明 |
|---|
None、False | 定义为假。 |
| 数字零 | 0、0.0、0j;以及 Decimal(0)、Fraction(0, 1) 等(标准库扩展数字)。 |
| 空容器 | ''、()、[]、{}、set()、range(0) 等。 |
产生布尔结果的运算/内置函数一般返回 False/True;例外:and / or 短路并返回某个操作数本身(不一定是 bool)。
| 运算 | 结果(语义) | 备注 |
|---|
x or y | x 为真则 x,否则 y | 短路:x 为真不求 y。 |
x and y | x 为假则 x,否则 y | 短路:x 为假不求 y。 |
not x | 真值取反,结果为 True 或 False | not 优先级低于非布尔运算符;not a == b 即 not (a == b);a == not b 非法。 |
| 运算 | 含义 |
|---|
< <= > >= | 有序比较(无意义组合会 TypeError,如复数参与大小比较)。 |
== != | 值相等;不同类型一般不做大小比较,但 == 总有定义(类可自定义 __eq__)。 |
is / is not | 对象标识(不可重载);适合与 None 比较:x is None。 |
- 链式比较:
x < y <= z 等价于 x < y and y <= z,且 y 只求值一次;x < y 为假时 z 不求值。
in / not in:成员检测,同属该优先级族,由可迭代对象或 __contains__ 支持。
| 与 JS 对照 | Python |
|---|
== 常伴隐式转换 | == 走 __eq__,一般不搞 JS 式宽松转换;身份用 is。 |
| 要点 | 内容 |
|---|
int | 任意精度(无固定 32/64 位溢出);bool 是 int 子类型。 |
float | 通常 C double;精度见 sys.float_info。 |
complex | 实部、虚部均为 float;用 z.real / z.imag;多数取模/整除类运算不适用。 |
| 混合运算 | 二元运算会「拓宽」:int → float → complex;比较按数学值理解。 |
// | 向下取整除法;对 int 结果为 int,对 float 可能为 float(见官方备注)。 |
位运算、附加方法、哈希规则等见 官方「数字类型」一节。
| 概念 | 要点 |
|---|
| 迭代器 | 实现 __next__,一次性耗尽;内置 iter / next 与之配合。 |
| 可迭代对象 | 实现 __iter__ 或序列式 __getitem__。 |
| 生成器 | 含 yield 的函数体返回的迭代器类型;属于迭代器的一种用法模式。 |
| 类型 | 可变性 | 要点 |
|---|
list | 可变 | 栈/队列常用;左端 pop(0) 为 O(n),高频双端见 collections.deque。 |
tuple | 不可变 | 可作 dict 键(元素也需可哈希);常用于固定结构、多返回值。 |
range | 不可变「视图」 | 惰性整数序列;不占满 [0..n) 的存储;len 极大时可能 OverflowError。 |
通用操作:拼接、重复、索引、切片、in、index、count 等见官方「通用序列操作」;可变序列另有 append、extend、pop 等。
| 要点 | 内容 |
|---|
| 模型 | 不可变 Unicode 码位序列;无单独 char 类型,单字符也是长度为 1 的 str。 |
| 字面量 | 单引号/双引号等价;三引号多行;前缀 r/f/rf 等。 |
| 方法族 | 查找、分割、拼接、大小写、判定类方法均返回新字符串。 |
| 格式化 | f"..."、str.format、format();旧式 % 仍可用。 |
与 JS:字符串不可变这点接近;编码/解码见 bytes 与 str.encode / bytes.decode。
| 类型 | 可变性 | 要点 |
|---|
bytes | 不可变 | 元素为 0..255 整数;字面量 b"..."。 |
bytearray | 可变 | 与 bytes 共享大量 API;可 append 整数等。 |
memoryview | 视底层缓冲区 | 零拷贝切片;与 缓冲区协议 协作。 |
| 类型 | 可变性 | 要点 |
|---|
set | 可变 | 无序、元素可哈希;并/交/差集运算丰富。 |
frozenset | 不可变 | 可作其他 set 的元素或 dict 键。 |
| 要点 | 内容 |
|---|
| 插入顺序 | 3.7+ 语言保证保留插入顺序(实现上已如此);依赖顺序的序列化/测试更稳。 |
| 键 | 必须可哈希;== 不同但哈希冲突的对象不能同时作为键。 |
| 视图 | dict.keys() / values() / items() 返回动态视图,字典改动会反映到视图上。 |
| 要点 | 内容 |
|---|
| 协议 | 实现 __enter__ / __exit__;供 with 使用。 |
| 典型 | 文件对象、锁对象等;__exit__ 负责吞异常或再抛出。 |
| 概念 | 要点 |
|---|
list[int] 等 | 运行时可得到 types.GenericAlias;3.9+ 内建泛型可直接写,旧代码曾用 typing.List。 |
X | Y | 3.10+ 等价 typing.Union[X, Y];与 TS 联合类型写法略像,语义以 typing / types.UnionType 为准。 |
| 类型 | 要点 |
|---|
| 模块 | __dict__ 存放命名空间;属性查找规则见官方。 |
| 类与实例 | 用户定义类;实例属性通常存在 __dict__(除非 __slots__)。 |
| 函数 / 方法 | 用户定义函数、绑定/未绑定方法对象;描述器把函数绑到实例上。 |
| 代码对象 | compile 产出;承载字节码与常量表等。 |
| 类型对象 | type 自身及各类对象;isinstance / issubclass 与之配合。 |
| 属性 | 常见含义 |
|---|
__dict__ | 对象可写命名空间(类侧可能被映射代理只读)。 |
__class__ | 实例所属类。 |
__bases__ / __mro__ | 基类元组、方法解析顺序。 |
__name__ / __qualname__ | 短名、限定名。 |
为防止对超大整数的 int(str) / str(int) 做 DoS,解释器可对转换长度设限;超限 ValueError。受影响 API 与配置见官方小节「整数字符串转换长度限制」。
| 实践建议 | 内容 |
|---|
| Web / 不可信输入 | 对「任意长十进制字符串」转 int 要有心理预期;必要时限制输入长度或分段处理。 |
| 调试 | 需要调整阈值时查官方 环境变量 / 配置 表。 |
资料: 内置类型