前端 Python 3.12

3. 内置类型

解释器内置的标准类型总览:真值与比较、数字与序列、文本与二进制、映射与集合、迭代与注解等;每节表格导读,细节以官方 stdtypes 为准。

本章对应标准库里对内置类型的集中说明:数字、序列、映射、类与实例、异常等;许多「多项集」操作会原地修改可变对象并返回 None,与链式返回新数组的 JS 习惯不同。

1 总览:可变与不可变

类别典型类型要点
不可变intfloatcomplexstrbytestuplefrozenset、固定内容的 range 视图等运算产生新对象;可作 dict 键的需可哈希(见官方「数字类型的哈希运算」等)。
可变listdictsetbytearray(及 memoryview 的某些用法)原地 appendpopupdate返回 None,不返回容器自身。

2 逻辑值检测

默认对象为真,除非类定义 __bool__ 返回假值或 __len__ 返回 0。内置假值大致如下:

假值对象说明
NoneFalse定义为假。
数字零00.00j;以及 Decimal(0)Fraction(0, 1) 等(标准库扩展数字)。
空容器''()[]{}set()range(0) 等。

产生布尔结果的运算/内置函数一般返回 False/True例外and / or 短路并返回某个操作数本身(不一定是 bool)。

3 布尔运算 and / or / not

运算结果(语义)备注
x or yx 为真则 x,否则 y短路:x 为真不求 y
x and yx 为假则 x,否则 y短路:x 为假不求 y
not x真值取反,结果为 TrueFalsenot 优先级低于非布尔运算符;not a == bnot (a == b)a == not b 非法。

4 比较运算

运算含义
< <= > >=有序比较(无意义组合会 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

5 数字类型 intfloatcomplex

要点内容
int任意精度(无固定 32/64 位溢出);boolint 子类型
float通常 C double;精度见 sys.float_info
complex实部、虚部均为 float;用 z.real / z.imag;多数取模/整除类运算不适用
混合运算二元运算会「拓宽」:intfloatcomplex;比较按数学值理解。
//向下取整除法;对 int 结果为 int,对 float 可能为 float(见官方备注)。

位运算、附加方法、哈希规则等见 官方「数字类型」一节

6 迭代器与生成器

概念要点
迭代器实现 __next__,一次性耗尽;内置 iter / next 与之配合。
可迭代对象实现 __iter__ 或序列式 __getitem__
生成器yield 的函数体返回的迭代器类型;属于迭代器的一种用法模式。

7 序列类型 listtuplerange

类型可变性要点
list可变栈/队列常用;左端 pop(0)O(n),高频双端见 collections.deque
tuple不可变可作 dict 键(元素也需可哈希);常用于固定结构、多返回值。
range不可变「视图」惰性整数序列;不占满 [0..n) 的存储;len 极大时可能 OverflowError

通用操作:拼接、重复、索引、切片、inindexcount 等见官方「通用序列操作」;可变序列另有 appendextendpop 等。

8 文本序列 str

要点内容
模型不可变 Unicode 码位序列;无单独 char 类型,单字符也是长度为 1 的 str
字面量单引号/双引号等价;三引号多行;前缀 r/f/rf 等。
方法族查找、分割、拼接、大小写、判定类方法均返回新字符串
格式化f"..."str.formatformat();旧式 % 仍可用。

与 JS:字符串不可变这点接近;编码/解码见 bytesstr.encode / bytes.decode

9 二进制序列 bytesbytearraymemoryview

类型可变性要点
bytes不可变元素为 0..255 整数;字面量 b"..."
bytearray可变bytes 共享大量 API;可 append 整数等。
memoryview视底层缓冲区零拷贝切片;与 缓冲区协议 协作。

10 集合类型 setfrozenset

类型可变性要点
set可变无序、元素可哈希;并/交/差集运算丰富。
frozenset不可变可作其他 set 的元素或 dict 键。

11 映射类型 dict

要点内容
插入顺序3.7+ 语言保证保留插入顺序(实现上已如此);依赖顺序的序列化/测试更稳。
必须可哈希== 不同但哈希冲突的对象不能同时作为键。
视图dict.keys() / values() / items() 返回动态视图,字典改动会反映到视图上。

12 上下文管理器类型

要点内容
协议实现 __enter__ / __exit__;供 with 使用。
典型文件对象、锁对象等;__exit__ 负责吞异常或再抛出。

13 类型注解相关:GenericAliasUnion

概念要点
list[int]运行时可得到 types.GenericAlias3.9+ 内建泛型可直接写,旧代码曾用 typing.List
X | Y3.10+ 等价 typing.Union[X, Y];与 TS 联合类型写法略像,语义以 typing / types.UnionType 为准。

14 其他内置类型(摘要)

类型要点
模块__dict__ 存放命名空间;属性查找规则见官方。
类与实例用户定义类;实例属性通常存在 __dict__(除非 __slots__)。
函数 / 方法用户定义函数、绑定/未绑定方法对象;描述器把函数绑到实例上。
代码对象compile 产出;承载字节码与常量表等。
类型对象type 自身及各类对象;isinstance / issubclass 与之配合。

15 特殊属性(常见名)

属性常见含义
__dict__对象可写命名空间(类侧可能被映射代理只读)。
__class__实例所属类。
__bases__ / __mro__基类元组、方法解析顺序。
__name__ / __qualname__短名、限定名。

16 整数字符串转换长度限制(3.11+)

为防止对超大整数的 int(str) / str(int) 做 DoS,解释器可对转换长度设限;超限 ValueError。受影响 API 与配置见官方小节「整数字符串转换长度限制」。

实践建议内容
Web / 不可信输入对「任意长十进制字符串」转 int 要有心理预期;必要时限制输入长度或分段处理。
调试需要调整阈值时查官方 环境变量 / 配置 表。

资料: 内置类型

On this page