2010-04-30 1 views

ответ

2

Вы не можете. Глобалы модуля a не подвержены влиянию модуля b, хотя модуль b копирует их на свои собственные глобалы.

from a import * в b.py просто делает foo в b быть ссылкой на тот же объект, что функции foo в a является ссылкой на. Он не копирует функцию. Функция не использует глобальные значения b во время обращения к глобальному имени.

передать его в качестве аргумента вместо:

import a 
bar = "baz" 
a.foo(bar) 

Или, если вы просто хотите изменить a.bar, вы можете присвоить этому. Это затрагивает все звонки на foo(), хотя и не только с b.

+0

Я бы посоветовал начинающим забыть, что у Python даже есть ключевое слово 'global'. (Я бы также предположил, что он будет снят с языка, но я полагаю, что кто-то нашел для него какое-то хорошее применение) – msw

+0

Кто сказал что-нибудь о ключевом ключе? Это полный не-op в вопросе OP. –

+0

Именно поэтому его присутствие настолько запутанно для новичков с других языков с различными концепциями сферы. – msw

1

Это ужасно не в духе питона, но ...

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) 

И посмотрите, это даже меньше печатает!

+2

'a.bar =" baz "' не работает, если вы только делали 'из импорта * '. 'from import *' не будет вводить имя 'a', а только имя' foo' (так как это все, что находится в 'a''s globals.) –

6

В простом примере реальный ответ в большинстве случаев заключается в использовании аргументов функции (как было упомянуто). Но если бы смысл был проверять правила обзора 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") ,

0

Альтернативно, и это плохой 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 = "" 

Это работает, потому что, как и Джереми отметил, объект модуля создается только в первый раз, он импортируется - любой дальнейший импорт, даже из других модулей, просто производит ссылку на тот же объект.

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