Python 中处理不规则数组需防范空值引发的 AttributeError、TypeError、IndexError;应使用 .get()、类型检查、try/except、默认值、类型提示及避免就地修改返回 None 等策略。

不规则数组(如嵌套列表深度不一、部分元素为 None、或子列表缺失)在 Python 中极易引发空指针类错误——虽然 Python 没有传统意义的“空指针”,但访问 None 的属性、对 None 调用方法、或索引不存在的嵌套层级,都会直接抛出 AttributeError、TypeError 或 IndexError。这类问题在处理 JSON 解析结果、API 响应、表格数据或用户输入时尤为常见。
检查嵌套层级是否存在
不要假设某一层级一定存在。例如,解析 {"user": {"profile": {"name": "Alice"}}} 后,若原始数据中 "profile" 字段可能缺失,直接写 data["user"]["profile"]["name"] 就会报 KeyError 或 TypeError(如果 "user" 是 None)。
- 用
.get()安全取值:name = data.get("user", {}).get("profile", {}).get("name") - 对可能为
None的中间变量做显式判断:if user and "profile" in user: ... - 使用
try/except KeyError捕获键缺失,比层层判空更简洁(尤其层级深时)
遍历前验证元素类型与非空性
面对类似 [["a", "b"], None, ["c"], []] 这样的不规则列表,直接 for sub in arr: for item in sub: 会在遇到 None 或空列表时出错。
- 跳过
None和非列表项:if isinstance(sub, list) and sub: - 统一用
or []提供默认值:for sub in arr: for item in (sub or []): ... - 对每个
sub先检查if sub is not None,再操作,避免TypeError: 'NoneType' object is not iterable
用类型提示 + 静态检查提前暴露风险
在函数签名中明确标注嵌套结构的可选性,配合 mypy 等工具能发现多数潜在空访问。
- 标注可选嵌套:
from typing import List, Optional, Dictdef process_users(users: Optional[List[Dict[str, Optional[str]]]]) -> None: - 这样调用方传入
None或字典中值为None时,mypy 会警告后续不可直接调用.upper()等方法 - 结合
assert或if not x: raise ValueError在入口处快速失败,比让错误蔓延到深层更易定位
避免就地修改引发的隐式 None
某些操作(如 list.sort()、list.reverse()、dict.clear())返回 None。若误将其赋值给变量,后续对该变量的操作就会触发空引用。
- 错误写法:
sorted_data = data.sort()→sorted_data是None - 正确写法:
data.sort()(就地排序),或sorted_data = sorted(data)(返回新列表) - 对不确定是否被就地修改的变量,加一行
assert result is not None快速兜底

















