该错误是因对None进行下标操作所致,常见于函数未返回值、就地方法误用、字典get未兜底、正则匹配失败、IO异常未处理等场景,需在每次取值前做类型与非空校验。

这个错误不是语法问题,而是运行时逻辑失控的明确信号:你正试图对 None 做下标操作(比如 [0]、['key'] 或 [1:3]),而 None 本身不支持任何索引行为。
函数没 return 或调用了就地方法(如 sort())
Python 函数默认返回 None;很多内置方法(如 list.sort()、list.reverse()、dict.update())也只修改原对象,返回 None。一旦你误把它们的返回值当结果用,下标就立刻崩。
- 错误写法:
data = [3, 1, 2]; sorted_data = data.sort(); print(sorted_data[0])——sort()返回None,不是新列表 - 正确写法:
data.sort()后直接用data[0],或改用sorted(data)[0] - 函数漏写
return是高频原因:分支路径中某条没返回值,执行到末尾就隐式返回None
字典取值未兜底,键不存在直接崩
dict['key'] 在键缺失时抛 KeyError,但很多人改用 dict.get('key') 却忘了它在键不存在时返回 None——后续再链式访问(如 .split(':') 或 [0])就触发本错误。
- 危险写法:
url = config.get('api_url'); host = url.split('://')[1].split('/')[0]—— 若api_url不存在,url是None,立刻报错 - 安全写法:
url = config.get('api_url', '')(空字符串可被split),或先判空:if url and '://' in url: - 更健壮:用
config.get('api_url') or ''替代裸get,避免None流入下游
正则匹配失败后直接调 .group()
re.search()、re.match() 在没匹配到时返回 None,但代码常假设“一定有匹配”,直接接 .group(1) 或 [0]。
立即学习“Python免费学习笔记(深入)”;
- 典型错误:
match = re.search(r'(\d+)', text); user_id = match.group(1)—— 若text不含数字,match是None - 必须加判空:
if match: user_id = match.group(1),不能靠try/except捕AttributeError来掩盖逻辑缺陷 - 别省略
match变量:写成re.search(...).group(1)会让判空无法进行,必须拆成两步
API 或 IO 失败后变量仍为 None
网络请求、文件读取、数据库查询失败时,若没处理异常或没设默认值,变量会保持初始化时的 None,后续却当作有效数据使用。
- 常见场景:异步函数未
await,或except块里没return/raise,导致变量作用域内仍是None - 修复重点不是“怎么 catch”,而是“在哪赋值”:确保每个可能路径都给变量赋了非
None值,或至少是空容器(如[]、{}) - 类型校验比单纯
is not None更关键:比如if data is not None and isinstance(data, list):,否则data=42过了is not None仍会在data[0]崩
真正棘手的不是 None 本身,而是它混在链式访问里(如 resp['data'][0]['id'])——一个环节为 None,整条链就断。防御性编程的关键,是把“可能为空”的假设刻进每次取值前的判断里,而不是等报错后再补 if。


















