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