【问题标题】:Why do I have an UnboundLocalError in this case?为什么在这种情况下会出现 UnboundLocalError?
【发布时间】:2019-07-01 21:07:07
【问题描述】:

(不问这个问题的解决方法,只是想了解错误)

我收到以下错误

UnboundLocalError: local variable new_list referenced before assignment

在尝试运行这段代码时。我的逻辑是“如果new_list 不存在,则创建new_list,否则使用分配new_list.next,但在这种情况下似乎不起作用。

有人可以向我解释为什么,我应该怎么做才能解决这个错误?

def addTwoNumbers(self, l1, l2):
    """
    :type l1: ListNode
    :type l2: ListNode
    :rtype: ListNode
    """
    temp = 0
    while l1 or l2:
        if l1 and l2:
            new_val = (l1.val + l2.val) % 10 + temp
            new_node = ListNode(new_val)
        if l1:
            new_node = ListNode(l1.val + temp)
        if l2:
            new_node = ListNode(l2.val + temp)
        if not new_list:
            new_list = new_node
        else:
            new_list.next = new_node
        if new_val and new_val > 9:
            temp = 1
        else:
            temp = 0
    return new_list

【问题讨论】:

  • 就像你说的:它不存在。所以你不能做if not new_list
  • 欢迎来到 StackOverflow。请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确说明问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您指定的问题。您发布的代码定义了一个函数并退出而不执行任何操作。我们不经常进行桌面检查。
  • @prune 在这种情况下,OP 的代码实际上正是重现 UnboundLocalError 所需的全部内容。我对UnboundLocalErrorin this answer有一个相当透彻的解释。对于 OP 的代码,他们分配给 new_list(隐式地将其设为局部变量)检查 new_list 的值之后(假定它是一个已经存在的非局部变量)。
  • @Iguananaut:我标记它是因为我在 Python 3.6.8 中没有遇到这样的错误。但是,感谢您的链接;我已将其标记为以后的 dup 锤的“最爱”。

标签: python


【解决方案1】:

l1l2 都是falsy 时,while 循环不会运行并且您的函数会直接转到return new_list——此时名称new_list 不是绑定到任何对象,即它尚未分配给对象。

通常的解决方法是在 while 循环之前将 new_list 设置为 默认 值,例如:

def addTwoNumbers(self, l1, l2):
    temp = 0
    # Here
    new_list = []
    while l1 or l2:
        ...
        ...
    return new_list

你也可以return早点赞:

def addTwoNumbers(self, l1, l2):
    if not any(l for l in {l1, l2}):
        return []

    temp = 0
    while l1 or l2:
        ...

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    相关资源
    最近更新 更多