【发布时间】:2019-04-25 13:23:35
【问题描述】:
这涉及到我在尝试解决链表反向问题时遇到的问题。
先放一些链表定义的初步代码和快速生成链表的方法:
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个变量交换,想法很简单,创建一个dummy head,并在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
但如果我稍微切换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'
所以看起来顺序在这里很重要,如果有超过 2 个变量,任何人都可以告诉我 python 如何评估交换值。
谢谢!
【问题讨论】:
-
哪个版本的python?
-
是python 3.6.4
-
真的,别那样做。
a, b = b, a适用于简单的交换,但对于更复杂的,只需编写单独的赋值语句即可。 -
您要交换的数据类型不是简单的基本数据类型,而是一个涉及到其他对象链接的类对象,这可能会导致此类意外行为!
-
@chepner 我打算从现在开始这样做。我不知道这会发生。一直认为一切都是同时评估的。
标签: python python-3.x swap