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方法。很好,请考虑这个例子,如果它帮助了你,因为你已经接受了另一个答案。