2013-09-30 2 views
1

У меня есть проект python с несколькими скриптами, запущенными файлами оболочки .sh.Глобальные переменные между скриптами

У меня есть файл конфигурации, который определяет словарь для использования в скриптах.

config.py

name_dict = dict() 

file1.py

from config import * 
.. 
.. 

## I have that reads tries to load the dump file that will contain the json values. 

name_dict = json.load(open(dict_file)) 

##This file - file1.py calls another function fun() in file2.py, iteratively 3/4 times. 
..  
file2.fun(args) 
print "Length of dict in file1.py : %d " %len(name_dict) // Always Zero ??? Considers name_dict as local variable. 

В file2 - file2.py, я определил name_dict с глобальным keyword.fun() использует и обновляет name_dict и, наконец, я печатаю длину dict в начале, и я нахожу его обновленным.

def fun(args)  
    global name_dict 
    print "Length of dict file2.py(start): %d " %len(name_dict) 
    .. 
    .. 
    print "Length of dict file2.py(end): %d " %len(name_dict) 

Каждый раз после того, как управление возвращается из file2, В file1.py я напечатает значение name_dict и она равна нулю. Но в следующем вызове fun() -> оператор печати по-прежнему печатает глобальное значение (длина) name_dict()

Но в файле file1.py он всегда равен нулю. Я предполагаю, что он рассматривается как локальная переменная. Как это исправить ?

ответ

2

Python does не имеют глобальные переменные. Все переменные заключены в модули, поэтому вы можете сказать, что вы определили переменные уровня модуля.

Для того, чтобы изменить переменную модуля вы должны назначить его на модуль:

#file1.py 
import config 

config.name_dict = json.load(...) 

Doing:

from config import * 

name_dict = json.load(...) 

просто создает новыйname_dict, переменная уровня модуля и присваивает новый объект для него, он не что-то изменить в модуле config.

Также обратите внимание, что инструкция global сообщает python, что данное имя не должно рассматриваться как локальная переменная. Например:

>>> x = 0 
>>> def function(): 
...  x = 1 
... 
>>> function() 
>>> x 
0 
>>> def function(): 
...  global x 
...  x = 1 
... 
>>> function() 
>>> x 
1 

Это не означает, что вы можете получить доступ к x из других модулей. Также полезно только тогда, когда назначая переменной:

>>> x = 0 
>>> def function(): 
...  return x + 1 
... 
>>> function() 
1 
>>> def function(): 
...  global x 
...  return x + 1 
... 
>>> function() 
1 

Как вы можете видеть, вы можете ссылаться на модуль уровня x, не говоря, что это global. То, что вы не можете сделать, это сделать x = something и изменить значение переменной уровня модуля.

+0

Значит ли это, что каждый раз, когда я использую name_dict (в файле1 или file2), я должен использовать config.name_dict (используя его пространство имен)? – Learner

+0

@Learner No. Вы можете использовать 'name_dict = config.name_dict' и использовать' name_dict', но когда вы выполняете задания, которые должны быть переданы другим модулям, вам придется это сделать.Во всяком случае, я думаю, что довольно редко использовать такой шаблон между модулем, поэтому вы можете просто реорганизовать код и избежать этого. – Bakuriu

+0

Кроме того, 'from config import *' в file1 должен импортировать все переменные (включая name_dict), определенные в config.py, правильно? Это то, о чем я думал. Поправьте меня если я ошибаюсь. – Learner

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