在Python中以逗号分隔的多个分配更改变量顺序

时间:2018-08-27 21:15:11

标签: python multiple-assignment

当在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'

在第二次(最后一次)迭代中,fastslow都不是Nonefast.next也不是None,但是我还是不明白为什么这会导致错误?不应同时执行多个任务吗?

更笼统地说,何时何地不能更改多重赋值语句的顺序而不影响结果?

编辑:我已经读过this question,尽管与之相关,但我仍然不知道那里的答案如何帮助解释我的问题。我将不胜感激。

0 个答案:

没有答案