Как я могу сделать эту печать «baz», когда я запустил b.py?Передача переменных в python при использовании из импорта *
a.py
def foo():
global bar
print bar
b.py
from a import *
bar = "baz"
foo()
Как я могу сделать эту печать «baz», когда я запустил b.py?Передача переменных в python при использовании из импорта *
a.py
def foo():
global bar
print bar
b.py
from a import *
bar = "baz"
foo()
Вы не можете. Глобалы модуля a
не подвержены влиянию модуля b
, хотя модуль b
копирует их на свои собственные глобалы.
from a import *
в b.py
просто делает foo
в b
быть ссылкой на тот же объект, что функции foo
в a
является ссылкой на. Он не копирует функцию. Функция не использует глобальные значения b
во время обращения к глобальному имени.
передать его в качестве аргумента вместо:
import a
bar = "baz"
a.foo(bar)
Или, если вы просто хотите изменить a.bar
, вы можете присвоить этому. Это затрагивает все звонки на foo()
, хотя и не только с b
.
Это ужасно не в духе питона, но ...
a.py
def foo():
print bar
b.py
from a import *
a.bar = "baz"
foo()
Я, как правило, чтобы избежать from <module> import *
больше. Ваше программирование вряд ли будет ограничено вашей скоростью ввода, и добавление имени модуля не должно быть слишком большим. Установка переменных в другом модуле - это то, что мне тоже неинтересно. Так что лучше будет образование:
a.py
def foo(bar):
print bar
b.py
import a
bar = "baz"
a.foo(bar)
И посмотрите, это даже меньше печатает!
'a.bar =" baz "' не работает, если вы только делали 'из импорта * '. 'from import *' не будет вводить имя 'a', а только имя' foo' (так как это все, что находится в 'a''s globals.) –
В простом примере реальный ответ в большинстве случаев заключается в использовании аргументов функции (как было упомянуто). Но если бы смысл был проверять правила обзора Python, то я думаю, что могу уточнить ...
Если вы думаете из контекста C/C++, вы можете легко смутить, как работает импорт Python. Импорт модулей не работает как директивы #include. В C/C++ компилятор будет использовать директивы #include в качестве маркеров для вставки исходного кода из других файлов источника/заголовка в текущий исходный файл (это собственная локальная копия включенного источника). Результатом является то, что когда он скомпилирован, глобальные блоки будут охвачены для этой единицы компиляции, которая включает в себя весь источник #included. Вы можете сделать некоторые грязные трюки с порядком #includes, чтобы сделать действительно сложный код. :-P
Импорт Python не предоставляет экземпляр локального модуля, который разделяет область импорта модуля. Вместо этого он предоставляет ссылку на одноэлементный объект модуля, который совместно используется в текущем выполнении интерпретатора. Объект модуля создается при первом ввозе. Последующие импорты, будь то в том же модуле или из совершенно разных модулей, просто получают ссылку на этот же объект модуля. «Глобальный» является глобальным в своем модуле. Из других модулей он будет доступен только через ссылку на этот модуль. Например, в a.py вам нужно будет импортировать b для доступа к значению «bar».
В вашем примере вы не должны этого делать, поскольку у вас будет циклический импорт. Если вам действительно нужно установить состояние с областью действия модуля, вы можете установить глобальный модуль модуля b: a.bar = bar
(адральная последовательность).
Не меняйте.ру,
def foo():
print bar
но изменить b.py на:
import a
a.bar = "baz"
a.foo()
А лучше инкапсулированного пример будет иметь a.py обеспечивает функцию, чтобы установить свое глобальное состояние, так что b.py может просто выполнить a.set_module_state("baz")
,
Альтернативно, и это плохой Python, если ваш проект действительно требует глобальных переменных, и нет необходимости, чтобы ваши модули были действительно «модульными» (то есть повторно использоваться в других проектах без изменений), вы могли бы всегда вводить модуль в третьегоglobals.py
:
a.py
import globals
def foo():
#global bar
print globals.bar
b.py
import globals
from a import *
globals.bar = "baz"
foo()
globals.py
#This module contains global variables
bar = ""
Это работает, потому что, как и Джереми отметил, объект модуля создается только в первый раз, он импортируется - любой дальнейший импорт, даже из других модулей, просто производит ссылку на тот же объект.
Я бы посоветовал начинающим забыть, что у Python даже есть ключевое слово 'global'. (Я бы также предположил, что он будет снят с языка, но я полагаю, что кто-то нашел для него какое-то хорошее применение) – msw
Кто сказал что-нибудь о ключевом ключе? Это полный не-op в вопросе OP. –
Именно поэтому его присутствие настолько запутанно для новичков с других языков с различными концепциями сферы. – msw