我无法在以下程序中写入全局变量。有人可以给我一个解决方案吗?请注意,我的var
变量必须位于Mod2.py
和Mod3.py
在Mod1.py中
var = 5
在Mod2.py中
from Mod1 import *
def foo(newValue):
global var
print('foo: %d' % var)
var = newValue
print('before: %d' % var)
foo(2)
print('after: %d' % var)
在Mod3.py
中from Mod2 import *
foo(3)
print('var: %d' % var)
运行Mod3.py
时的结果是
before: 5
foo: 5
after: 2
foo: 2
var: 2
但我希望它是
before: 5
foo: 5
after: 2
foo: 2
var: 3
我不想使用import Modx.py
答案 0 :(得分:2)
这可能与导入变量并不像你想象的那样:
from Mod1 import var
与
相同import Mod1
var = Mod1.var # this creates a new variable
虽然我无法准确解释您的代码中发生了什么,但我可以说通过将您的导入更改为:
import Mod1
并将var(现在没有全局)称为
Mod1.var
问题解决了。
<强> Mod2.py
强>
import Mod1
def foo(newValue):
print('foo: %d' % Mod1.var)
Mod1.var = newValue
print('before: %d' % Mod1.var)
foo(2)
print('after: %d' % Mod1.var)
<强> Mod3.py
强>
import Mod1
from Mod2 import *
foo(3)
print('var: %d' % Mod1.var)
<强>输出:强>
before: 5
foo: 5
after: 2
foo: 2
var: 3
请花点时间浏览http://www.python.org/dev/peps/pep-0008/;它建议的一些事情:
* avoid wildcard imports (`from <module> import *`) for the various problems they introduce
* module names should be `lowercase`
此外,全局变量通常不被认为是好的,并且总是有一种解决方法;见Why are global variables evil?。
答案 1 :(得分:0)
我不想使用
的解决方案import Modx.py
那是不可能的。执行所需操作的唯一方法是重新绑定其他模块中的名称,这需要直接导入和访问模块而不是名称。
答案 2 :(得分:0)
你需要说from mod1 import var
。
为什么?
你的代码说from mod1 import
,但如果你看一下,你可以说它是一个未完成的陈述。你想要它导入什么?你必须指定。如果您不想执行更简单的过程import mod1
,这将导入所有内容。
答案 3 :(得分:0)
是的,我读过一篇详细阐述mixins邪恶的文章。在我的例子中,包含相互关联的函数(没有使用类)的原始代码太过膨胀,我决定将它们分成2个模块(B.py
和C.py
)。但是,2访问了几个相同的变量,因此我将这些变量分解为A.py
。然后我D.py
包含依赖于B.py
和C.py
中的函数的函数。依赖图如下所示:
A
/ \
B C
\ /
D
(Bottom依赖于顶部)
我没有充分的理由使用mixins,它只是从1开始,我想我想将它们保存在同一名称空间中,甚至分成四个模块。
刚才我想到了为每个变量使用getter
和setter
函数的解决方案。但我放弃了这个想法,因为它太笨拙了。