在一行中重新分配多个变量

时间:2018-10-24 03:23:11

标签: python linked-list

我正在尝试了解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'

我正在使用与正确答案完全相同的替代词,只是顺序不同。为什么我的代码会引发错误?一线变量重新分配时顺序是否重要?

1 个答案:

答案 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

不会引发任何异常。