#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. почти все переменные могут быть покрыты при присвоении, почему глобальная переменная не может быть покрыта локальной переменной? Это технический предел или продуманный дизайн?