A LeetCode 问题 这是关于与此结构相关的链表:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
尝试打印下一个节点的 val 时出错,但在进行无效检查时仍然有效(它甚至从未进入
else
语句)。
假设
l1
是 ListNode
类的实例,其中 print(l1.nextNode)
给出:
ListNode{val: 4, next: ListNode{val: 3, next: None}}
还有:
nextNode = l1.next
为什么会失败:
print(nextNode.val)
AttributeError: 'NoneType' object has no attribute 'val'
虽然这有效:
if nextNode is not None:
print(nextNode.val)
else:
print("Node is None")
额外: 我想知道上面的答案是否与为什么这也与 try/catch Fails 有关:
try:
print("try block executed")
print(nextNode.val)
except:
**print("except block executed1")
print(nextNode.val)**
if nextNode is not None:
print("except block executed"2)
print(nextNode.val)
else:
print("Node is None")
虽然这有效并打印
try block executed
:
try:
print("try block executed")
print(nextNode.val)
except:
if nextNode is not None:
print("except block executed")
print(nextNode.val)
else:
print("Node is None")
当您到达列表末尾时,
nextNode
将变为 None
。 None
没有 val
属性,因此 nextNode.val
会引发异常。
如果你先检查是否是
None
,你就不会执行那个错误的表达式,所以不会有错误。
当您使用
try/except
时,它会捕获异常。但随后在 except:
块中,您尝试打印相同的内容。它再次引发异常,这次没有 try/except
来捕获它,因此程序因错误而停止。