Python: Совместное использование глобальных переменных между модулями и классами там

Я знаю, что возможно совместно использовать глобальную переменную через модули в 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 чайкой ().

35
задан emish 26 July 2010 в 19:30
поделиться

2 ответа

Это происходит из-за того, что вы используете неизменяемые значения (целые числа и None), а импорт переменных похож на передачу данных по значению, а не по ссылке.

Если вы сделали global_mod.x списком и изменили его первый элемент, он работал бы так, как вы ожидаете.

Когда вы выполняете из global_mod import x , вы создаете имя x в своем модуле с тем же значением, что и x в global_mod . Для таких вещей, как функции и классы, это работает так, как и следовало ожидать, потому что люди (обычно) не переназначают эти имена позже.

Как указывает Алекс, если вы используете import global_mod , а затем global_mod.x , вы избежите проблемы. Имя, которое вы определяете в своем модуле, будет global_mod , которое всегда относится к желаемому модулю, а затем, используя доступ к атрибутам для доступа к x , вы получите последнее значение ] x .

37
ответ дан 27 November 2019 в 07:05
поделиться

from whatever import * - это не хорошая идиома для использования в коде - она предназначена для использования, если вообще используется, в интерактивном сеансе как сокращение для экономии набора текста. По сути, это "снимок" всех имен из модуля в данный момент времени - если вы когда-нибудь перепривяжете любое из этих имен, снимок устареет, и возникнут всевозможные проблемы. И это только начало неразрывной неразберихи, на которую вы подписываетесь, используя убогую конструкцию from ... import *.

Хотите мой совет? Забудьте, что вы когда-либо слышали о существовании этой конструкции, и никогда, никогда не используйте ее снова. Используйте import global_mod as m и всегда используйте после этого квалифицированные имена, такие как m.x -- квалифицированные имена настолько удобнее и мощнее в Python, чем простые имена, что это даже не смешно. (Часть as m оператора import совершенно необязательна и существует в основном для краткости, или иногда для решения некоторых проблем с несовпадением имен; используйте ее, когда и если она вам удобна, поскольку у нее нет недостатков, но не чувствуйте себя вынужденными или даже вынужденными использовать ее, если вы не чувствуете в ней необходимости).

26
ответ дан 27 November 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: