Глобальные переменные и глобальные операторы из других модулей

Я столкнулся с некоторым странным поведением в отношении того, как Python обрабатывает глобальные (модульные) переменные и ключевое слово global.

Модуль 1:

g = None

def set_g_up():
    global g
    g = "foo"

set_g_up()
print g

Модуль 2:

from module_1 import *

set_g_up()
print g

Модуль 1 выводит, как и ожидалось, "foo".
Модуль 2 выводит None!

Какая? Это один и тот же объект! Или, по крайней мере, я ожидаю, что это будет.


person Profpatsch    schedule 22.10.2013    source источник


Ответы (1)


У каждого модуля есть своя глобальная область имен. Импортируя все через * из другого модуля, вы создаете копии (дополнительные ссылки на значения) глобальных переменных другого модуля в свой собственный модуль.

Используйте квалифицированные имена, чтобы этого не произошло:

import module_1

module_1.set_g_up()
print module_1.g

Невозможно получить доступ к той же самой переменной, назвав ее g, если вы на самом деле имеете в виду переменную module_1.g. Все, что вы можете сделать, это чтобы обе переменные содержали одно и то же значение (имеет смысл только для списков, объектов и других изменяемых переменных).

person Alfe    schedule 22.10.2013
comment
Еще одна причина неизменности. Теперь я понимаю Рика Хики. - person Profpatsch; 22.10.2013