Поскольку имена переменных объявляются локальными, если в них есть назначение, и я хочу получить доступ к переменным модуля из функции, могу ли я импортировать имя модуля в модуле, а затем использовать его для доступа к переменным модуля?
Пример (имя файла: server.py):
import server
bar = 5
def foo():
server.bar = 10
Вместо использования global
оператора, как предложено во всех других ответах, не используйте переменные уровня модуля, а класс как контейнер или другой модуль только для глобальных переменных:
# mg.py
bar = 5
# server.py
import mg
def foo():
mg.bar = 10
или
class mg:
bar = 5
def foo():
mg.bar = 10
Таким образом, вам не нужно размещать global
операторы повсюду, вы можете повторно использовать эти имена, и это ясно, какой bar
вы имеете в виду.
Edit: Кроме того, можно импортировать модуль внутри себя, но вы не можете изменять переменные в основном модуле таким образом. Так что это сработает:
# selfimport.py
import selfimport
def foo():
print selfimport.foo
bar = 3
if __name__ == '__main__':
print selfimport.bar
foo()
Но это не будет:
# selfimport.py
import selfimport
bar = 3
def foo():
selfimport.bar = 5
if __name__ == '__main__':
print selfimport.bar
foo()
print bar # bar is still 3!
Если вы используете глобальные переменные как константы, вам не понадобится global
оператор. Вам также необходимо убедиться в том, что вы обертываете код, который хотите выполнить только в главном модуле в инструкции if
как указано выше, или вы будете рекурсивно.
Вы не можете импортировать его так, и вам не нужно. Просто используйте глобальную переменную модуля.
def foo():
global bar
bar = 10
вам нужно объявить его глобальным, чтобы он был установлен, вместо создания локальной переменной.
Почему нет:
def foo():
global bar
bar = 10
нет, вместо этого используйте глобальный оператор:
def foo():
global bar
bar = 10
global
утверждения, которое точно предназначено для этого?