
在 Python 链表操作中,直接访问 node.next.val 会因 node.next 为 None 而抛出 AttributeError;而添加 is not None 检查或正确使用 try/except 可避免崩溃——本质是 Python 对空引用的严格属性访问机制所致。
在 python 链表操作中,直接访问 `node.next.val` 会因 `node.next` 为 `none` 而抛出 `attributeerror`;而添加 `is not none` 检查或正确使用 `try/except` 可避免崩溃——本质是 python 对空引用的严格属性访问机制所致。
在 LeetCode 经典题「两数相加」(Add Two Numbers)中,链表节点定义如下:
# Definition for singly-linked list.
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
当你执行 nextNode = l1.next 后尝试 print(nextNode.val) 报错:
AttributeError: 'NoneType' object has no attribute 'val'
根本原因:nextNode 实际为 None(例如当前节点已是链表尾部),而 None 是 Python 中一个特殊单例对象,它不拥有任何实例属性,包括 val。Python 不支持类似 Java/C# 的“安全导航操作符”(如 ?.),因此对 None.val 的访问会立即触发异常。
✅ 正确做法:显式空值检查(推荐,清晰、高效、可读性强)
if nextNode is not None:
print(nextNode.val)
else:
print("Reached end of list")
⚠️ 错误用法:在 except 块中重复访问 None.val
try:
print(nextNode.val)
except AttributeError:
print("except block executed")
print(nextNode.val) # ❌ 再次触发 AttributeError!程序终止
该写法会导致二次崩溃:首次 nextNode.val 抛出异常 → 进入 except → 第二次 nextNode.val 仍为 None → 再次抛出相同异常,且外层无嵌套 try 捕获,最终导致未处理异常中断执行。
✅ 安全的异常处理(仅作补充,不替代空检查)
try:
print(nextNode.val)
except AttributeError:
if nextNode is None:
print("Node is None — end of list")
else:
print(f"Unexpected error on node with type {type(nextNode)}")
? 关键总结:
- Python 中
None是明确的对象,不是“空指针”,它没有属性和方法; - 所有对
None的属性访问(如.val,.next,.foo)均抛出AttributeError; -
is not None检查是链表遍历的强制前置步骤,非冗余逻辑; -
try/except应用于不可预知的异常场景,而链表末尾None是确定性边界条件,优先使用防御式编程(guard clause)而非异常流控; - 在算法题调试中,务必覆盖单节点、空链表等边界用例——正如提问者发现的:“仅 1 个节点时
l1.next必为None”。
遵循这一原则,不仅能避免运行时错误,更能写出健壮、可维护的链表操作代码。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











