交换机制-链表

问题描述 投票:0回答:1

我以为这是同一件事,但事实并非如此

这不起作用

cur, cur.next, prev = cur.next, prev, cur 

这正在工作

cur.next, cur, prev = prev, cur.next, cur 

几行:

tmp = cur.next  

cur.next = prev 

prev = cur 

cur = tmp

我正在尝试了解python的内部机制

python linked-list
1个回答
0
投票

计算赋值时

<target(s)> = <expression>
,在将结果分配给目标之前先对表达式进行整体计算。

表达式的求值通常以确定性的方式进行,对于像

<x>, <y>, ...
这样的元组表达式,这是从左到右的。

所以,对于:

cur, cur.next, prev = cur.next, prev, cur 

cur.next, prev, cur
被评估并产生三个值的元组:无论
cur.next
是什么,然后是
prev
,然后是
cur

然后将这个三元组值(在分配期间不会改变)解压到目标上,并按顺序进行分配(从左到右)。所以,

cur
被分配了
cur.next
,然后
cur.next
(这是
new
.next
cur
)被分配了
prev
,最后
prev
被分配了
cur
- 但它是重要的是要意识到这仍然是评估时的
cur
值,而不是更改后的
cur

同样,对于:

cur.next, cur, prev = prev, cur.next, cur 

prev, cur.next, cur
被评估并产生一个包含三个值的元组:无论
prev
是什么,然后是
cur.next
,然后是
cur

然后将这个三元组值解压缩到目标上并按顺序进行分配。因此,

cur.next
被分配
prev
,然后
cur
被分配
cur.next
,最后
prev
被分配
cur
- 同样,这仍然是评估时的
cur
值,而不是更改后的
cur 
.

所以,结果是不同的。

cur
仍然变为
cur.next
,但
cur.next
获取
prev
的值,而不是
cur.next.next
获取该值。

另一种看待这个问题的方式:

x, y, z = a, b, c

是这样的:

k = a
l = b
m = c

x = k
y = l
z = m

另请考虑这个例子:

class Link:
    def __init__(self, data, next_=None):
        self.data = data
        self.next = next_


def main():
    elem = Link(0)
    root = Link(1, elem)

    print(root.data, root.next.data)

    cur, cur.data = root, 2  # cur.data can be assigned here, after cur
    cur, cur.data = cur.next, cur.data  # cur is updated before cur.data

    print(root.data, root.next.data)


main()

输出是

1 0
2 2

有些人可能预计第一次作业会出现错误,或者结果会是

2 0

© www.soinside.com 2019 - 2024. All rights reserved.