我正在尝试理解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/

10-13 02:54