Python – Какой приоритет имеет глобальный характер?

Я немного смущен глобальными, когда дело доходит до пакетов с использованием других пакетов. Из быстрого поиска Google; это не так много объясняет.

Проще говоря: на каком уровне переменная «глобализована» при использовании global ? Это на уровне модуля, уровне пакета или уровне переводчика? Т.е., в такой установке, как:

 <Package> |- __init__.py |- Module.py |- Module2.py 

и существует global статистика, используемая в Module.py, является переменной, глобализированной только для этого модуля или всего пакета (включая Module2.py и или __init__.py), или на уровне интерпертера (для чего-либо, выполняемого в интерпретаторе ).

Кроме того, если в __init__.py я from .Module import * , будут ли импортированные функции, содержащие глобальный оператор «правильно глобализовать» любую указанную переменную для этого файла?

Насколько глобальными являются глобальные переменные?

Так называемые «глобальные» переменные в Python действительно являются модульными. Существуют глобальные глобальные глобальные переменные, которые живут в модуле __builtin__ в Python 2 или builtins в Python 3, но вы не должны трогать их. (Также обратите внимание на наличие или отсутствие s . __builtins__ – это его собственная странная вещь).

Что делает global оператор?

global утверждение означает, что для только той функции, в которой оно появляется , указанное имя или имена переменных ссылаются на «глобальные» (на уровне модуля) переменные (переменные), а не на локальные переменные.

Что относительно import * ?

О боже, не делай этого. Глобалы достаточно плохи, но импортировать их хуже, а делать это с помощью import * – это самый худший способ сделать это. То, что система импорта делает с глобальными переменными, ужасно удивительно для новых программистов и почти никогда не то, что вы хотите.

Когда вы import * , это не означает, что ваш модуль начинает искать глобальные переменные импортированного модуля для поиска переменных. Это означает, что Python смотрит в импортированный модуль, находит его «общедоступные» глобальные переменные * и присваивает своим текущим значениям именованные новые глобальные переменные в текущем модуле.

Это означает, что любые присвоения вашим новым глобальным переменным не будут влиять на оригиналы, и любые присваивания оригиналам не будут влиять на ваши новые переменные. Любые функции, импортированные с помощью import * , по-прежнему ищут исходные переменные, поэтому они не будут видеть изменений, внесенных вами в ваши копии, и вы не увидите изменений, которые они вносят в свои. Результаты – путаница.

Серьезно, если вы абсолютно должны использовать глобальные переменные другого модуля, импортируйте его с import othermodule синтаксиса import othermodule и получите доступ к глобальным переменным с помощью othermodule.whatever_global .


* Если модуль определяет список __all__ , «общедоступные» глобальные переменные являются переменными, имена которых отображаются в этом списке. В противном случае это переменные, имена которых не начинаются с подчеркивания. функции def хранятся в обычных переменных, поэтому они включаются по тем же критериям, что и другие переменные.