【问题标题】:Reassigning multiple variables in one line在一行中重新分配多个变量
【发布时间】:2018-10-24 03:23:11
【问题描述】:

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

我使用与正确答案完全相同的替换,只是顺序不同。为什么我的代码会抛出错误?当涉及到一行变量重新分配时,顺序是否重要?

【问题讨论】:

  • 明确一点,如果您更改顺序以匹配示例代码,您的代码是否有效?
  • 展示如何构建一个会引发错误的最小列表
  • @Blorgbeard 是的,如果我更改订单,它会起作用。
  • @MadPhysicist 更新

标签: python linked-list


【解决方案1】:

问题是head.next 在第一次迭代后变成了None。然后在第二次迭代中,head 被分配给head.next,即在调用head.next(左侧)之前设置为无,因此出现错误。例如让我们有以下场景:

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

结果:

Traceback(最近一次调用最后一次):文件“main.py”,第 9 行,在 spam.foo, spam, spam.bar = spam.bar, None, spam.foo AttributeError: 'NoneType' object has no attribute 'bar'

所以要回答您的问题,顺序确实很重要。实际上将 toy 示例的顺序更改为:

spam.foo, spam.bar, spam = spam.bar, spam.foo, None

不抛出任何异常。

【讨论】:

  • 那么 Python 是不是像这样从左到右分配变量呢?我理解这个问题,但我仍然不明白为什么“正确”响应(似乎也应该将 head.next 设置为 None)有效。
  • 我会这么认为。在另一个答案中,head.next 在更改 head 的值之前被调用,因此在调用之前未设置为 None
  • @DanielQ 更新了答案!
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 2016-12-13
  • 2021-11-09
  • 1970-01-01
相关资源
最近更新 更多