1

我有一个 python 项目,其中很少有由 .sh shell 文件运行的脚本。

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

配置文件

name_dict = dict()

文件1.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。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 中它始终为零。我的猜测是它被视为局部变量。我该如何解决 ?

4

2 回答 2

2

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

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

#file1.py
import config

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

正在做:

from config import *

name_dict = json.load(...)

simple 创建一个 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更改模块级变量值。

于 2013-09-30T20:37:05.607 回答
0

len(name_dict.items)

#这不会是零

于 2021-09-24T19:09:06.527 回答