python 使用逗号交换值会导致混乱

Cod*_*755 4 python swap python-3.x

这涉及到我在尝试解决链表反向问题时遇到的一个问题。

首先放一些链表定义和生成链表的快速方法的初步代码:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

    def __repr__(self):
        if self.next:
            return "{}->{}".format(self.val, repr(self.next))
        else:
            return "{}".format(self.val)

def genNode(*nodes, end=None):
    if len(nodes) == 1 and type(nodes[0]) == list:
        nodes = nodes[0]
    for i in nodes[::-1]:
        n = ListNode(i)
        n.next, end = end, n
    return n if nodes else None
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是我发现交换机制仍然取决于我编写的变量的顺序。

最初,当我们谈论 python 中的交换值时,我们可以这样做:

a, b = b, a
Run Code Online (Sandbox Code Playgroud)

如果我有的话,它应该以同样的方式工作

b, a = a, b
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写的这个反向链表方法有3个变量交换,想法很简单,创建一个虚拟头,并在dummy和dummy.next之间不断添加节点,这样就可以反转。

def rev(head):
    dummy = ListNode('X')
    while head:
        dummy.next, head.next, head = head, dummy.next, head.next
    return dummy.next

a = genNode(1,2,3,4)
print(rev(a)) # >>> 4->3->2->1
Run Code Online (Sandbox Code Playgroud)

但是如果我稍微改变三个变量的顺序:

def rev2(head):
    dummy = ListNode('X')
    while head:
        dummy.next, head, head.next, = head, head.next, dummy.next,
    return dummy.next

a = genNode(1,2,3,4)
print(rev2(a))  # >>> AttributeError: 'NoneType' object has no attribute 'next'
Run Code Online (Sandbox Code Playgroud)

所以看起来顺序在这里很重要,任何人都可以让我知道如果有两个以上的变量,python 如何评估交换值。

谢谢!

far*_*ncz 5

左到右

\n\n

看看https://docs.python.org/3/reference/simple_stmts.html#assignment-statements

\n\n

CPython 实现细节:在当前实现中,目标的语法与表达式的语法相同,并且在代码生成阶段拒绝无效语法,从而导致不太详细的错误消息。

\n\n

尽管赋值的定义意味着左侧和右侧之间的重叠是 \xe2\x80\x98simultaneous\xe2\x80\x99 (例如 a, b = b,a 交换两个变量),但内部重叠分配给变量的集合从左到右出现,有时会导致混乱。例如,以下程序打印 [0, 2]:

\n\n
x = [0, 1]\ni = 0\ni, x[i] = 1, 2         # i is updated, then x[i] is updated\nprint(x)\n
Run Code Online (Sandbox Code Playgroud)\n