Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python使用逗号交换值会造成混乱_Python_Python 3.x_Swap - Fatal编程技术网

python使用逗号交换值会造成混乱

python使用逗号交换值会造成混乱,python,python-3.x,swap,Python,Python 3.x,Swap,这涉及到我在尝试解决链表反向问题时遇到的一个问题 首先,让我介绍一下链表定义的一些初步代码和生成链表的快速方法: class ListNode: def __init__(self, x): self.val = x self.next = None def __repr__(self): if self.next: return "{}->{}".format(self.val, repr(self

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

首先,让我介绍一下链表定义的一些初步代码和生成链表的快速方法:

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
我的问题是,我发现交换机制仍然取决于我所写变量的顺序

最初,当我们讨论python中的值交换时,我们可以:

a, b = b, a
如果我有,它也应该以同样的方式工作

b, a = a, b
我正在尝试编写的反向链表方法有3个变量交换,其思想很简单,创建一个虚拟头,并在虚拟头和虚拟头之间一致地添加节点。下一步,以便可以反转

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
但如果我稍微改变3个变量的顺序:

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'
因此,这里的顺序似乎很重要,如果有两个以上的变量,有人能告诉我python如何计算交换值吗


谢谢

如果有两个以上的变量,其工作原理与两个相同。您将它们按所需的最终顺序放置:

>>> a = 1
>>> b = 2
>>> c = 3
>>> c,b,a = a,b,c
>>> a,b,c
(3, 2, 1)
从左到右

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

虽然赋值的定义意味着左手边和右手边之间的重叠是“同时的”(例如a,b=b,a交换两个变量),但赋值变量集合中的重叠从左到右发生,有时会导致混淆。例如,以下程序打印[0,2]:

x = [0, 1]
i = 0
i, x[i] = 1, 2         # i is updated, then x[i] is updated
print(x)

下面的一个简单示例应该向您说明对类
ListNode

让我们定义一个3元素的链表

a = ListNode(1)
b = ListNode(2)
c = ListNode(3)
a.next = b
b.next = c
print(a)
#1->2->3
现在如果我们换成b和c,它不会有任何效果

b,c = c,b
print(a)
#1->2->3
如果我们交换a和b,链表就会改变

a,b=b,a
print(a)
#2->3
a和c交换也是如此

a,c=c,a
print(a)
#3

因此,您可以看到,使用简单交换逻辑在如何应用于
列表节点方面是不一致的,因此应该避免使用。

哪一版本的python?它是python 3.6.4真的,只是不要这样做
a,b=b,a
对于简单的交换很好,但是对于任何更复杂的事情,只需编写单独的赋值语句。您交换的数据类型不是简单的基本数据类型,而是一个涉及到其他对象链接的类对象,这可能会导致像这样的意外行为@切普纳:我计划从现在开始这样做。我不知道这会发生。始终认为所有内容都是同时评估的。为了将其与OP的示例联系起来:在
rev()
中,
head
head之后更改。next
被分配给;在
rev2
中,
head
之前被更改,从而更改分配给的内容。这很有趣,如果我尝试
x[I],I=2,1
,它实际上会工作。因此,顺序很重要,但可能会令人困惑。因此,(C)Python迭代RHS上值的
元组
,并将它们分配给LHS上名称的
元组
,按元素顺序分配?如果您将逗号分隔的列表解释为
元组
,这种操作方式似乎非常合乎逻辑。因此,为了安全起见,您是否建议我在遇到复杂/多个交换情况时,通过创建临时变量回到经典的交换方法?类似于不更改您正在迭代的
列表
,您可能应该避免为可能影响同一赋值语句中其他赋值的名称赋值,如示例中所示。这个例子构造得非常好,我从来没有见过这样的代码。谢谢,这是一个很好的演示。我应该避免在复杂的数据结构中使用SWAP方法。很好,请考虑这个例子,如果它帮助了你,因为你已经接受了另一个答案。