2015-02-11 2 views
1

Мощный звук новичка-иш, но здесь идет.Импорт python разделяет общие значения?

Я импортирую скрипт Typedef, который содержит переменные, которые используются и вызывается в моей программе. Я делаю это, просто позвонив 'import Typedef' по всем скриптам внутри пакета/рабочей области.

Теперь я изменить переменную в Typedef в одном из сценариев по телефону:

Typedef.myVariable = newVariable 

Будет ли это изменение отразится, если другие сценарии ссылки на эту переменную?

Если нет, что мне делать, чтобы исправить это?

Если это помогает, я использую Python 3.4, кодируя с помощью Spyder Anaconda.

+0

«Будет ли это изменение отражено, если другие скрипты ссылаются на эту переменную?» «Я предлагаю эмпирический подход:« попробуйте и посмотрите »;-) – Kevin

+0

Да, это произойдет, если другие скрипты будут импортированы одновременно. Я часто использую эту технику в своих программах Pygame, создавая класс данных, который все другие классы могут импортировать, изменять и взаимодействовать. –

ответ

3

Да, как сказано в комментариях.

Вы просто должны заботиться о конструкциях, как

from TypeDef import myvariable - в этом случае, MyVariable новое имя указывает на значение переменной во время импорта, и не будет «видеть» обновления новые значения для TypeDef.myvariable.

Как только вы назначаете имя для объекта в локальном пространстве имен (или «глобальном» пространстве имен - в Python, глобальные переменные на самом деле являются «модульными локалями»), это имя указывает на этот конкретный объект.

Просто используйте это с осторожностью и не забудьте документировать такое использование в своем проекте. Это то, что в основном используется в Python вместо «Singletons», необходимое для статических языков.

Кроме того, эта техника может быть использована для изменения фактически функций или классов в других модулях - это то, что называется «Monkey patching». (Нехорошо, в общем, для производственного кода - и, с другой стороны, для тестирования кода, где вы зависите от патча обезьяны проверяемой функции с макетными объектами)

0

Да, поскольку переменные в вашем модуле Typedef находятся в область модуля, которая будет доступна там, где этот модуль импортируется.

Для дальнейшего ознакомления, взгляните на Python Scopes and Namespaces.

Смежные вопросы