当在Python中使用多个分配时,例如
a, b, c = b, c, a
我一直认为参数的相对顺序无关紧要(只要双方都一致),即如果一个参数相同,结果将相同
c, a, b = a, b, c
当a, b, c
是自变量时,这似乎是正确的,但当它们相互关联时,似乎就不是正确的。
例如,如果我们如下定义链表的节点:
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
并编写一个函数以就地反向链接列表:
def reverseList(head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head is None:
return head
slow = None
fast = head
while fast is not None:
fast.next, slow, fast = slow, fast, fast.next
return slow
然后可以正常工作,例如:
head = ListNode(1)
head.next = ListNode(2)
reverseList(head)
但是,如果我们用不同的分配顺序替换循环中的行:
fast, fast.next, slow = fast.next, slow, fast
然后我们得到一个错误
AttributeError: 'NoneType' object has no attribute 'next'
在第二次(最后一次)迭代中,fast
和slow
都不是None
,fast.next
也不是None
,但是我还是不明白为什么这会导致错误?不应同时执行多个任务吗?
更笼统地说,何时何地不能更改多重赋值语句的顺序而不影响结果?
编辑:我已经读过this question,尽管与之相关,但我仍然不知道那里的答案如何帮助解释我的问题。我将不胜感激。