(Python)除非我检查无效性,否则无法访问对象的属性,为什么?

问题描述 投票:0回答:1

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")
python class attributes try-catch nonetype
1个回答
0
投票

当您到达列表末尾时,

nextNode
将变为
None
None
没有
val
属性,因此
nextNode.val
会引发异常。

如果你先检查是否是

None
,你就不会执行那个错误的表达式,所以不会有错误。

当您使用

try/except
时,它会捕获异常。但随后在
except:
块中,您尝试打印相同的内容。它再次引发异常,这次没有
try/except
来捕获它,因此程序因错误而停止。

© www.soinside.com 2019 - 2024. All rights reserved.