Python 这两个有什么不同?

Python 这两个有什么不同?,python,Python,我不明白上面这个和下面这个有什么区别 def reverseList(self, head): prev, curr = None, head while curr: curr.next, prev, curr = prev, curr, curr.next return prev 为什么会有不同的结果? 我认为第一个函数和第二个函数的声明方式是相同的。它们在第一种方法中切换值,但在第二种方法中,它们相互分配变量。在第一个函数中,curr被分配

我不明白上面这个和下面这个有什么区别

def reverseList(self, head):
    
    prev, curr = None, head
    while curr:
        curr.next, prev, curr = prev, curr, curr.next
    return prev
为什么会有不同的结果?
我认为第一个函数和第二个函数的声明方式是相同的。

它们在第一种方法中切换值,但在第二种方法中,它们相互分配变量。

在第一个函数中,
curr
被分配curr.next的旧值,而在第二个函数中,
curr
被分配
curr.next
(又名
prev
)的new值。

在第一个代码中,当执行
curr=curr.next
时,
curr.next
是“multi assign”语句之前的任何值

在第二个代码中,当执行
curr=curr.next
时,
curr.next
具有先前执行的
curr=prev
语句所具有的值


如果要使用“multi assign”语句运行三行代码,应使用:

curr.next,prev,curr=prev,curr,prev

使用helper
ListNode
类可以很容易地显示这一点(我使用
next
,因为
next
在Python中是一个保留字):

类列表节点:
def uuu init uuuu(self,name=None,next=None):
self.name=名称
self.next=下一个_
定义(自我):
返回f'ListNode[{self.name}->{self.next}]'
prev,curr=ListNode('P'),ListNode('C'))
打印(上一页,上一页下一页,当前页,当前页下一页)
当前下一个uu=上一个
上一次=当前
curr=curr.next_
打印(上一页,上一页下一页,当前页,当前页下一页)
#ListNode[P->None]无ListNode[C->None]无
#ListNode[C->ListNode[P->None]]ListNode[P->None]ListNode[P->None]None
prev,curr=ListNode('P'),ListNode('C'))
打印(上一页,上一页下一页,当前页,当前页下一页)
当前,当前,当前=当前,当前,当前
打印(上一页,上一页下一页,当前页,当前页下一页)
#ListNode[P->None]无ListNode[C->None]无
#ListNode[C->ListNode[P->None]]ListNode[P->None]ListNode[P->None]None

这是因为在第一行代码中,所有赋值都使用原始值一次执行

def reverseList(self, head):
    
    prev, curr = None, head
    while curr:
        curr.next = prev
        prev = curr
        curr = curr.next
    return prev
在第二种情况下,当您将curr.next指定给curr时,curr.next已经等于前面指定的prev。所以curr最终得到prev的值,这与第一种方法不同,第一种方法所有的curr都得到原始值

def reverseList(self, head):
    
    prev, curr = None, head
    while curr:
        curr.next = prev
        prev = curr
        curr = curr.next
    return prev

对于第二个示例(即没有变量交换),您需要一个临时变量来存储
curr的值。接下来

第一种方法:-)首先,同时切换该值;第二步,一步一步执行;这意味着步骤3中的
curr.next
将是步骤1中的
prev
,而
curr.next
仍然是
curr.next
在first中它似乎是正确的。我没有检查
curr.next,prev,curr=prev,curr,prev
的结果,但这个想法是正确的。所以我投了赞成票。用“多重分配”的方式来做这件事是一种困惑。我已经放弃了。你可以使用
。next
作为属性,好吧。你当然可以。我只是不喜欢用它。