Ошибка Numpy, на которую ссылаются перед назначением в python

#python

#python

Вопрос:

вот мой код на Python:

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

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

когда я запускаю этот код, интерпретатор выдает мне ошибку, показывающую blow:

 UnboundLocalError: local variable 'numpy' referenced before assignment
  

Похоже, что перед выполнением numpy = None импортированный модуль «numpy» был покрыт, хотя переменной numpy нет.

Мой вопрос в том, что именно интерпретатор сделал во время инициализации класса (не объекта)?

Комментарии:

1. Почему вы присваиваете numpy = None ? Это заставляет Python думать, numpy что это локальная переменная.

2. Если ваша функция содержит присвоение переменной, то по умолчанию переменная является локальной для функции.

Ответ №1:

РЕДАКТИРОВАТЬ: В качестве ответа на ваш комментарий Python просматривает каждую строку кода перед его выполнением и проверяет правильность синтаксиса и другие вещи. Чтобы проверить это, запустите следующий код.

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

Он вызовет SyntaxError ничего не печатая, даже если SyntaxError после print инструкции, потому что он проверяет код, а затем только запускает его.

Внутри функции он также считает, что все переменные, которые были назначены при проверке, должны быть локальными. Если вы этого не хотите, вы должны явно сказать об этом, используя ключевые слова global или nonlocal .

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

Комментарии:

1. @Asocia, готово. Что означает OP?

2. Код бессмыслен, просто для воспроизведения проблемы, с которой я столкнулся. Но я не понимаю, почему переменная является локальной перед исключением numpy = None

3. Коды обрабатываются построчно, так почему numpy = None это повлияет на предыдущее использование numpy? Что интерпретатор Python сделал с классом перед его инициализацией?

4. спасибо за ваш ответ, он работает. Похоже, это правило python, так почему python не преобразует numpy в локальную переменную до выполнения присваивания?

5. почти все переменные могут быть покрыты при присвоении, почему глобальная переменная не может быть покрыта локальной переменной? Это технический предел или продуманный дизайн?