【问题标题】:Numpy Referenced before assignment error in python在 python 中的赋值错误之前引用了 Numpy
【发布时间】:2020-09-03 11:39:41
【问题描述】:

这是我的python代码:

import numpy
class test:
  def __init__(self,):
    print(numpy.__version__)
    if False:
      numpy = None

if __name__=='__main__':
  print(numpy.__version__)
  T = test()

当我运行这段代码时,解释器给我一个错误提示:

UnboundLocalError: local variable 'numpy' referenced before assignment

看起来,在执行numpy = None之前,导入的模块“numpy”已经被覆盖,而没有numpy变量。

我的问题是解释器在初始化一个类(不是对象)时到底做了什么?

【问题讨论】:

  • 你为什么要分配numpy = None?这让 Python 认为 numpy 是一个局部变量。
  • 如果您的函数包含对变量的赋值,则默认情况下该变量是函数的局部变量。

标签: python


【解决方案1】:

编辑:作为对您评论的回复,Python 在执行之前检查每一行代码,并查看语法是否正确以及其他内容。要对其进行测试,请运行以下代码。

def foo():
    print("Hello, I won't be printed.")
    : # Syntax Error!!!
foo()

即使SyntaxErrorprint 语句之后,它也会引发SyntaxError 而不打印任何内容,因为它会检查代码然后只运行它。

在函数内部,它还认为在检查时发现分配的所有变量都应该是本地的。如果您不想这样做,则必须使用 globalnonlocal 关键字明确说明。

class test:
  def __init__(self,):
    global numpy
    print(numpy.__version__)
    if False:
      numpy = None

【讨论】:

  • @Asocia,完成。 OP 代表什么?
  • 代码没有意义,只是为了重现我遇到的问题。但我很困惑为什么在执行 numpy = None 之前变量是本地的
  • 代码是逐行执行的,为什么numpy = None会影响之前numpy的使用呢? python解释器在初始化之前对类做了什么?
  • 感谢您的回答,它有效。这似乎是python的一条规则,那么为什么python不将numpy转换为局部变量,直到赋值执行呢?
  • 赋值时几乎所有的变量都可以覆盖,为什么全局变量不能被局部变量覆盖?是技术限制还是深思熟虑的设计?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 2017-11-11
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
相关资源
最近更新 更多