推荐用 if seq: 判断序列是否为空,因其更简洁、安全、高效且符合Pythonic;len(seq) == 0 有额外开销且对 None 抛异常,而 if not seq: 语义更直白但无法区分 None 与空序列。

Python中判断列表、字符串等序列是否为空,为什么推荐用 if seq: 而不是 if len(seq) == 0:
因为隐式布尔判断更简洁、更安全、性能更好,且符合 Python 的惯用法(Pythonic)。len() 调用是额外开销,而空序列在布尔上下文中天然为 False,非空为 True。
常见错误现象:if len(my_list) == 0: 在 my_list 是 None 时会抛出 TypeError: object of type 'NoneType' has no len();而 if my_list: 虽然也会出错(None 是 falsy,但后续逻辑可能误判),但至少不会因调用 len 崩溃——这提醒你该先做类型/存在性检查。
- 所有内置序列类型(
list、tuple、str、bytes、range、dict、set、frozenset)都遵循此规则:空即False -
if not seq:等价于 “是否为空”,语义更直白,但需注意它无法区分None和空序列(二者都是 falsy) - 若变量可能为
None,应先明确检查:if seq is not None and not seq:
哪些对象不适用隐式布尔判断来判断“空”?
不是所有“看起来像容器”的对象都把空状态映射到布尔值。典型反例是 numpy.ndarray 和 pandas.Series,它们重载了 __bool__ 但禁止对多元素数组做隐式布尔判断,直接用会报错。
错误现象:if np.array([1, 2]): 抛出 ValueError: The truth value of an array with more than one element is ambiguous.
- 对
numpy数组,必须显式用.size == 0或.size(因为ndarray.size返回 int,可直接布尔判断) - 对
pandas.Series或DataFrame,用.empty属性最稳妥(ser.empty返回 bool) - 自定义类若未实现
__bool__但实现了__len__,Python 会回退到len(obj) == 0判断,此时隐式判断仍有效;但如果只实现__bool__,那它就完全掌控真假逻辑
if not x: 和 if x is None: 混用时的典型陷阱
很多人想“判断是否为空或未初始化”,于是写成 if not x:,结果发现 x = 0、x = False、x = "" 全都被误判为“空”,而实际业务中 0 可能是合法有效值。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
使用场景:函数参数默认为 None,你想区分“用户传了空列表”和“用户根本没传”。这时 if x is None: 是唯一可靠方式。
-
if not x:检查的是“falsy”,包括None,False,0,0.0,"",[],{},set()等 -
if x == []:只匹配空列表,但会误伤其他空序列(如""或()),且对自定义类可能触发意外的__eq__ - 最精确的空序列判断(限定类型):用
isinstance(x, list) and not x
性能差异真的显著吗?什么时候值得抠这个细节?
单次判断几乎无感,但在高频循环(如解析百万行日志、处理流式数据)中,len(seq) == 0 比 not seq 多一次方法查找和整数比较,实测慢 1.5–2 倍(CPython 3.11,小列表)。
更重要的是语义清晰度:读代码的人看到 if items: 立刻明白“有东西才进”,而 if len(items) != 0: 让人多停顿半秒想“为什么要算长度?”
- 对
list、str等,len()是 O(1),但函数调用本身有开销;隐式判断直接查对象头字段,更快 - 对某些自定义容器(比如惰性求值的迭代器包装类),
len()可能触发完整遍历,而隐式判断可能只检查内部标志位 - 团队协作中,统一用
if seq:/if not seq:能减少风格争议,PEP 8 也隐含支持这种写法
实际写代码时,最容易被忽略的是:**隐式布尔判断依赖对象是否正确定义了 __bool__ 或 __len__,而第三方库的自定义类可能两者都没实现,此时 bool(obj) 会返回 True(仅当 __bool__ 和 __len__ 都不存在时,Python 默认返回 True)——这种对象用 if obj: 就会永远为真,哪怕它逻辑上是空的。**
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










