在Python中交换三个对象。为什么订单是相关的?

在Python中交换三个对象。为什么订单是相关的?,python,Python,我想更好地理解在Python中三个对象的交换是如何工作的。我很好奇在使用下面的语法交换对象及其属性时,顺序如何影响结果 left, right, right.attr = right, left.attr, right 特别是,我有以下代码,其中我要反转链接列表: class Solution(object): def reverseList(self, head)

我想更好地理解在Python中三个对象的交换是如何工作的。我很好奇在使用下面的语法交换对象及其属性时,顺序如何影响结果

left, right, right.attr = right, left.attr, right 
特别是,我有以下代码,其中我要反转链接列表:

class Solution(object):                                                            
    def reverseList(self, head):                                                   
        """                                                                        
        :type head: ListNode                                                       
        :rtype: ListNode                                                           
        """                                                                        
        if not head or not head.next: 
            return head                                  

        prev, cur = None, head                                                     
        while cur:
            cur, prev = swap(cur, prev)                                                                                                                                                                      
        return prev
我正在考虑两个
swap
函数,每个函数的重新分配对象顺序不同:

def swap_bad(cur, prev):
    prev, cur, cur.next = cur, cur.next, prev 
    return cur, prev


我希望这两个函数是等效的,但正如名称所示,第一个函数不起作用,而第二个函数起作用。你能解释一下为什么会这样吗?

下面是Python执行命令顺序的一个示例

设置如下所示:

class Test:
    def __init__(self, name, nxt=None):
        self.name = name
        self.nxt = nxt

    def __str__(self):
        nxt = self.nxt.name if self.nxt is not None else None
        return f"Test(name={self.name}, nxt={nxt})"


prev = Test(0)
cur = Test(1, prev)

def swap_good(cur, prev):
    cur.nxt, cur, prev = prev, cur.nxt, cur

def swap_bad(cur, prev):
    prev, cur, cur.nxt = cur, cur.nxt, prev
事实上,输出是不同的:

swap_good(cur, prev)
print(cur)
print(prev)
# Test(name=1, nxt=0)
# Test(name=0, nxt=None)
相对于

# re-initialize cur, prev as above
swap_bad(cur, prev)
print(cur)
print(prev)
# Test(name=1, nxt=0)
# Test(name=0, nxt=0)  # nxt=0 instead of nxt=None
分解函数

from dis import dis
dis(swap_good)
dis(swap_bad)
swap\u提供良好的

20 0加载\u快速1(上一个)
2加载\u快速0(电流)
4加载属性0(nxt)
6快速加载0(电流)
八点三分
10点2分
12负载快速0(电流)
14商店属性0(nxt)
16存储快速0(当前)
18商店快速1(上)
20负载常数0(无)
22返回值
对于
swap\u bad

35 0加载\u快速0(cur)
2加载\u快速0(电流)
4加载属性0(nxt)
6加载速度1(上一个)
八点三分
10点2分
12商店快速1(上一个)
14商店快速0(当前)
16负载快速0(电流)
18商店属性0(nxt)
20负载常数0(无)
22返回值

你可以看到其中的区别(查阅表格,你可以了解这里到底发生了什么;我承认我懒得这么做,但这应该会让你开始)

为什么不让你的生活变得简单,使用一个临时变量呢?我需要知道为什么。我需要知道python中交换变量的工作原理。我想这里面一定有一些有用的信息。结果如何变化?
from dis import dis
dis(swap_good)
dis(swap_bad)