Проблема с доступом к переменной из функции в другом файле

#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 в коде реального мира. это всего лишь абстракция. сетвар уже вызван. Но это моя вина, что я этого не сказал