Python中Node类类型标注疑问:引号使用及与ListNode差异咨询
类型标注中字符串引号的差异解析
先看你给出的两段代码:
Node类代码
class Node: def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None): self.val = int(x) self.next = next self.random = random def copyRandomList(self, head: 'Optional[Node]') -> 'Optional[Node]':
ListNode类代码
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class Solution: def reorderList(self, head: Optional[ListNode]) -> None:
一、Node类用字符串包裹类型的原因
这是Python类型标注里的前向引用问题:
- Python解析类定义是从上到下逐行执行的,当解析到
Node类的__init__方法时,Node类本身还没完全创建完成(要等整个class Node:块执行完才会生成类对象),直接写Node会触发NameError。 - 用字符串
'Node'包裹,是告诉类型检查器:这个类型就是当前正在定义的类,Python运行时不会直接解析这个字符串,只会把它当作标注信息,避免了运行时错误。 - 同理,
copyRandomList里的'Optional[Node]'也是前向引用——如果这个函数在Node类定义完成前被解析,直接写Optional[Node]会找不到Node类型,所以必须用字符串包裹。
二、ListNode类不需要引号的原因
ListNode的__init__方法里,next参数没有加类型标注,自然不存在前向引用问题。Solution类在ListNode类定义完成之后才定义,当解析reorderList方法的head: Optional[ListNode]时,ListNode已经是完全创建好的类对象,Python可以直接找到它,所以不用字符串包裹。
补充验证
如果给ListNode的__init__加类型标注,写成下面这样,同样需要用字符串包裹:
class ListNode: def __init__(self, val=0, next: 'ListNode' = None): self.val = val self.next = next
因为此时__init__方法定义时,ListNode类还未完全创建,直接写ListNode会报错。
内容的提问来源于stack exchange,提问作者Atanu17
相关产品推荐
相关产品推荐

