Я знаю, что возможно совместно использовать глобальную переменную через модули в Python. Однако я хотел бы знать степень, до которой это возможно и почему. Например,
global_mod.py
x = None
mid_access_mod.py
from global_mod import *
class delta:
def __init__(self):
print x
bot_modif_mod.py
import mid_access_mod
import global_mod
class mew:
def __init__(self):
global_mod.x = 5
def main():
m = mew()
d = mid_access_mod.delta()
Это не печатает Ни один, даже при том, что все модули совместно используют глобальную переменную x. Почему имеет место это? Кажется, что x оценен в mid_access_mod.py, прежде чем это будет присвоено в bot_modif_mod.py чайкой ().
Это происходит из-за того, что вы используете неизменяемые значения (целые числа и None), а импорт переменных похож на передачу данных по значению, а не по ссылке.
Если вы сделали global_mod.x списком и изменили его первый элемент, он работал бы так, как вы ожидаете.
Когда вы выполняете из global_mod import x
, вы создаете имя x
в своем модуле с тем же значением, что и x
в global_mod
. Для таких вещей, как функции и классы, это работает так, как и следовало ожидать, потому что люди (обычно) не переназначают эти имена позже.
Как указывает Алекс, если вы используете import global_mod
, а затем global_mod.x
, вы избежите проблемы. Имя, которое вы определяете в своем модуле, будет global_mod
, которое всегда относится к желаемому модулю, а затем, используя доступ к атрибутам для доступа к x
, вы получите последнее значение ] x
.
from whatever import *
- это не хорошая идиома для использования в коде - она предназначена для использования, если вообще используется, в интерактивном сеансе как сокращение для экономии набора текста. По сути, это "снимок" всех имен из модуля в данный момент времени - если вы когда-нибудь перепривяжете любое из этих имен, снимок устареет, и возникнут всевозможные проблемы. И это только начало неразрывной неразберихи, на которую вы подписываетесь, используя убогую конструкцию from ... import *
.
Хотите мой совет? Забудьте, что вы когда-либо слышали о существовании этой конструкции, и никогда, никогда не используйте ее снова. Используйте import global_mod as m
и всегда используйте после этого квалифицированные имена, такие как m.x
-- квалифицированные имена настолько удобнее и мощнее в Python, чем простые имена, что это даже не смешно. (Часть as m
оператора import
совершенно необязательна и существует в основном для краткости, или иногда для решения некоторых проблем с несовпадением имен; используйте ее, когда и если она вам удобна, поскольку у нее нет недостатков, но не чувствуйте себя вынужденными или даже вынужденными использовать ее, если вы не чувствуете в ней необходимости).