该错误是运行时对None进行下标操作所致,因sort()等就地方法、漏写return或API失败导致返回None;需先判空再类型校验,如isinstance(items,(list,tuple))and items。

这个错误不是语法问题,而是运行时逻辑缺陷:你试图对 None 做下标操作(比如 [0]、['key']、[1:3]),而 None 本身不支持任何索引行为。
为什么函数/方法返回 None 而不是预期对象
Python 中很多操作默认不返回值,隐式返回 None。常见于:
-
list.sort()、list.reverse()、dict.update()等就地修改方法 —— 它们不返回新对象,只返回None - 函数末尾漏写
return,或条件分支中某些路径没写return - 调用 API 或读取配置失败时,未做异常处理或兜底,直接让变量保持为
None - 使用
re.search()但匹配失败,返回None,接着就写match.group(1)
直接检查 is not None 不够安全
仅判断 obj is not None 只能防住 None,但不能保证它是可下标的类型。例如:
data = 42
if data is not None:
print(data[0]) # 还是报错:'int' object is not subscriptable
更稳妥的做法是组合校验:
- 先确认不是
None - 再确认是目标类型(如
isinstance(data, (list, tuple, dict))) - 对字典额外检查 key 是否存在(
'key' in data),对列表/元组检查长度(len(data) > 0)
推荐的校验写法(按场景选)
✅ 列表/元组取首项:
if isinstance(items, (list, tuple)) and items:
first = items[0]
✅ 字典取值(避免 KeyError + TypeError 双重风险):
if isinstance(config, dict) and 'timeout' in config:
timeout = config['timeout']
# 或更简洁:
timeout = config.get('timeout') if isinstance(config, dict) else None
✅ 第三方 API 响应解析(如 OpenAI / 百度千帆):
if resp is not None and hasattr(resp, 'choices') and resp.choices:
content = resp.choices[0].message.content
⚠️ 注意:不要用 try/except TypeError 来“兜底”所有下标访问 —— 它会掩盖真正的问题类型(比如把 int 当 list 用),调试成本反而更高。
最容易被忽略的是:校验必须在每次下标操作前做,而不是只在数据入口处做一次。尤其在链式调用(如 a.b.c[0].d)中,中间任意一环为 None 都会崩,得拆开逐层判空。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











