我正在尝试理解reverses a linked list的一些代码。
这是我构造链接列表的方式:
class Node:
def __init__(self, value, next=None):
self.value = value
self.next = next
def initialize():
start = Node(0)
prev = start
for i in range(1, 6):
cur = Node(i)
prev.next = cur
prev = cur
return start
这是答案中的正确代码:
def reverse_list(head):
new_head = None
while head:
head.next, head, new_head = new_head, head.next, head
return new_head
这是我所拥有的:
def reverse_list(head):
new_head = None
while head:
new_head, head, head.next = head, head.next, new_head
return new_head
但是,我的代码在反转链表时抛出
AttributeError
:AttributeError: 'NoneType' object has no attribute 'next'
我使用的是与正确答案完全相同的替代词,只是顺序不同。为什么我的代码会引发错误?一线变量重新分配时顺序是否重要?
最佳答案
问题是head.next
在第一次迭代后变为None
。然后在第二次迭代中,将head
分配给head.next
,即在调用head.next
(在左侧)之前将其设置为None,因此会出现错误。例如,让我们有以下情形:
class Spam:
def __init__(self):
self.foo = 1
self.bar = 2
spam = Spam()
spam.foo, spam.bar = spam.bar, spam.foo
print(spam.foo, spam.bar) # 2, 1 as expected
但是当我们这样做时:
spam.foo, spam, spam.bar = spam.bar, None, spam.foo
结果是:
追溯(最近一次呼叫最近):文件“ main.py”,第9行,在
spam.foo,spam,spam.bar = spam.bar,None,spam.foo AttributeError:“ NoneType”对象没有属性“ bar”
因此,回答您的问题顺序很重要。实际上,将玩具示例的顺序更改为:
spam.foo, spam.bar, spam = spam.bar, spam.foo, None
不会抛出任何异常。
关于python - 在一行中重新分配多个变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52960638/