【发布时间】:2018-09-23 00:44:10
【问题描述】:
一直以来,我一直认为a, b, c = c, a, b 与a, c, b = c, b, a 相同...我认为这是一种同时分配变量的方法,因此您不必创建一堆临时变量。但显然它们是不同的,因为有人破坏了我的代码。
这是我的原始/工作实现:
class Node:
def __init__(self, v = None, next = None):
self.v = v
self.next = next
def __repr__(self):
return "Node(v=%r, nextV=%r)" % (self.v, self.next.v if self.next else None)
a = Node(1)
b = Node(2)
a.next = b
def flip(nodeA, nodeB):
nodeB, nodeA.next, nodeA = nodeA, nodeB, nodeA.next
return (nodeA, nodeB)
a, b = flip(a, b)
print "A=%r; B=%r" % (a, b)
其正确/预期的行为是交换链表中的两个节点,如下面的输出所示:
A=Node(v=2, nextV=None); B=Node(v=1, nextV=2)
但是,如果我像这样重新排序翻转功能:
def flip(nodeA, nodeB):
nodeB, nodeA, nodeA.next = nodeA, nodeA.next, nodeB
return (nodeA, nodeB)
...那个输出坏了:
A=Node(v=2, nextV=2); B=Node(v=1, nextV=2)
节点 A 最终得到一个指向自身的指针(它的 nextV 和 v 相同),因此沿着这棵树的尝试将永远递归。
为什么这些结果不一样?元组解包不应该表现得好像所有分配都同时发生吗?
【问题讨论】:
-
@CharlesDuffy,开心吗?
-
我给出了一个关于 python 如何从左到右(不是同时)分配事物的答案,但是看到代码我不确定问题出在分配而不是它的含义,这就是封装一个无限递归循环
-
@Raksha 请尊重。
-
@Raksha 正如我所说,保持尊重。叫人巨魔不会帮助你得到答案。 minimal reproducible example 是必需的。在您提供问题后,我将尝试回答您的问题。我还将撤回我的反对票并结束投票。
-
顺便说一句,如果我尝试编辑问题以获得正确的 MCVE,您会感到被冒犯吗?
标签: python variable-assignment