Python 冰山:藏在语言水面下的四十多个「会咬人」的隐秘行为
来源: aleyan.com — 2026-09-08
概述
这是把 Python 行为陷阱按「冰山」隐喻排成的一张清单页:水面之上是新手常见坑,水面之下是藏得深、一踩就懵的冷门角落,共有四十多项且每项都给出官方文档或 issue 出处。从可变默认参数、循环变量泄漏、zip 静默截断、惰性闭包、NaN 非自反、[[]]*3 别名共享,到 eval/exec 与反序列化并非沙箱、银行家舍入、边遍历边改集合、字符串驻留、bool 是 int 子类、random 不安全、-O 会删掉 assert、裸 except 连 Ctrl-C 都吞、strip() 删的是字符集而非前后缀、GIL、ctypes 结构体交换陷阱、audit hook 的静默否决、bytearray.extend 溢出等,几乎覆盖了从语言语义到 C API、再到多进程/共享内存的各个角落。
核心要点
- 可变默认参数在函数定义时只求值一次,会跨调用共享状态
- 循环不建作用域导致 i 泄漏到外层;闭包延迟绑定看到的是循环最终值
- eval/exec 与反序列化都不是沙箱,喂不可信输入等于任意代码执行
- round 是银行家舍入;边遍历边删会跳元素、边加可能死循环
- strip() 删的是两端字符集合而非精确前后缀,应改用 removeprefix/removesuffix
金句
eval() evaluates a Python expression and exec() executes Python statements. Neither is a sandbox.
👍 0
👎 0
返回 Lobsters 首页