2013-09-30 81 views
1

我有一个python项目,其中有几个由.sh shell文件运行的脚本。脚本之间的全局变量

我有一个配置文件,它定义了跨脚本使用的字典。

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. 

在文件2 - 全球keyword.fun file2.py,我已经定义name_dict()使用和更新name_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) 

从文件2,控制返回后,每到这时,在file1.py我打印name_dict的价值,它是零。但是,在下一次调用fun() - > print语句时仍然会打印出name_dict()的全局值(长度)

但是在file1.py中它总是为零。我的猜测是它被视为一个局部变量。我该如何解决 ?

回答

2

Python does 不是有全局变量。这些变量都包含在模块中,因此您可以说您定义的是模块级变量。

为了修改必须将其分配给该模块的模块变量:

#file1.py 
import config 

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

这样做:

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(在file1或file2中)我都应该使用config.name_dict(使用它的名称空间)? – Learner

+0

@学习者号码您可以使用'name_dict = config.name_dict'并使用'name_dict',但是当您执行应该传递给其他模块的分配时,您必须这样做。无论如何,我认为在模块之间使用这种模式非常罕见,所以您可能只需重构代码并避免这种情况。 – Bakuriu

+0

另外,file1中的'from config import *'应该导入config.py中定义的所有变量(包括name_dict)吗?这就是我一直在想的。如我错了请纠正我。 – Learner