我正在尝试了解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'
我正在使用与正确答案完全相同的替代词,只是顺序不同。为什么我的代码会引发错误?一线变量重新分配时顺序是否重要?
答案 0 :(得分:1)
问题在于,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,无,spam.foo AttributeError:'NoneType'对象没有属性'bar'
因此要回答您的问题,顺序确实很重要。实际上,将玩具示例的顺序更改为:
spam.foo, spam.bar, spam = spam.bar, spam.foo, None
不会引发任何异常。