我以为这是同一件事,但事实并非如此
这不起作用
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的内部机制
计算赋值时
<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
。