【发布时间】:2021-07-14 22:41:03
【问题描述】:
我正在尝试使用 Python 逗号赋值来并行更改变量的值。我相信 Python 会首先评估右侧表达式的值,然后将这些值分配给左侧的变量。一个具体的例子就是这个反向链表代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
prev = None
curr = head
while curr != None:
prev, curr.next, curr = curr, prev, curr.next
return prev
prev, curr.next, curr = curr, prev, curr.next 工作得很好。如果我将顺序更改为prev, curr, curr.next = curr, curr.next, prev,我希望我的代码可以正常工作:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
prev = None
curr = head
while curr != None:
prev, curr, curr.next = curr, curr.next, prev
return prev
但是,我在该行的第二个代码中得到了一个错误:
AttributeError: 'NoneType' object has no attribute 'next'
prev, curr, curr.next = curr, curr.next, prev
这对我来说没有意义,因为 Python 在赋值之前首先评估右侧表达式,这意味着我放置表达式的顺序无关紧要。我在这里遗漏了什么吗?
【问题讨论】:
-
请在您的问题中编辑您的代码,使其成为minimal reproducible example - 任何人都应该能够将单个复制/粘贴到文件中并且不添加任何东西 运行它以查看您看到的相同问题。因此,您需要包含导入、数据和所有引用的函数/类。确保在将代码编辑到您的问题中后,您可以按照我描述的方式运行您的代码。
-
如果将 None 分配给 curr,curr.next 将引发错误。
-
如果您在任何时候评估和分配 RHS 中的元组 (somenode, None, someothernode) 到 prev, curr, curr.next 那么在 curr.next 之前分配的 curr 指针变为 None当您尝试分配 curr.next 时会引发错误
-
可怕的想法。使您的代码易于人们阅读。技巧表明缺乏经验。
标签: python linked-list singly-linked-list