#python
Вопрос:
Мне нужно получить переменную, объявленную в функции в другом файле. Требование состоит в том, что я не могу вызвать переменную из setvar()
функции.
set.py
:
def setvar():
global x
x = 100
def getvar():
return x
if __name__ == '__main__':
setvar()
getvar()
get.py
:
import set
y = set.getvar()
print(y)
Ошибка:
NameError: name 'x' is not defined
Почему x
не определено? Когда я печатаю его getvar
, x
определяется.
Как я могу изменить его, чтобы он заработал?
Комментарии:
1. Потому
x
что определено вsetvar
, но вы звоните напрямуюgetvar
.return x
найдет для значенияx
которого не определено2. Я думал, что getvar возвращает глобальную переменную при вызове. Чего мне не хватает?
3. Вы должны объявить переменную
x
в самом начале вашегоset.py
файла.4. Я установил x=0 в начале set.py, и я получаю 0 в get.py. Но мне нужна функция setvar для обновления переменной. Итак, как я могу получить значение 100 в get.py?
5. Когда вы запускаете другой файл, вы вызываете функцию setvar. Если вы хотите такого же поведения, вам все равно нужно вызывать обе функции. Непонятно, почему вы ожидаете, что глобальное ключевое слово будет найдено только при вызове getvar
Ответ №1:
Почему x не определен?
Причина в вашей линии:
if __name__ == '__main__':
Как вы знаете, эта строка означает, что код в if
инструкции выполняется только в том случае, если программа запускается напрямую, а не импортируется в другую программу. Поскольку вы только импортируете set.py
программу в get.py
программу, setvar()
функция никогда не вызывалась, следовательно x
, переменная никогда не определялась.
Требование состоит в том, что я не могу вызвать переменную из функции setvar.
Это не проблема! Все, что вам нужно будет сделать setvar()
, это один раз вызвать функцию за пределами if __name__ == '__main__':
блока, и проблема будет устранена:
set.py
:
def setvar():
global x
x = 100
def getvar():
return x
setvar()
if __name__ == '__main__':
getvar()
get.py
:
import set
y = set.getvar()
print(y)
Выход:
100
Комментарии:
1. Я не могу снова вызвать setvar в коде реального мира. это всего лишь абстракция. сетвар уже вызван. Но это моя вина, что я этого не сказал