我有一个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.
在file2 - file2.py 中,我定义了name_dict和global 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() - > print语句仍然打印name_dict()
的全局值(长度)但是在file1.py中它始终为零。我的猜测是它被视为局部变量。我该如何解决 ?
答案 0 :(得分:2)
Python 不具有全局变量。变量都包含在模块中,因此您可以说您定义的是模块级变量。
要修改模块变量,必须将其分配给模块:
#file1.py
import config
config.name_dict = json.load(...)
这样做的:
from config import *
name_dict = json.load(...)
simple创建一个 new name_dict
,模块级变量并为其分配一个新对象,它不更改{{1}中的任何内容}模块。
另请注意,config
语句告诉python不应将给定名称视为局部变量。例如:
global
不意味着您可以从其他模块访问>>> 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
并更改模块级变量值。