0

我无法在以下程序中写入全局变量。有人可以给我一个解决方案吗?请注意,我的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

4

4 回答 4

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`

此外,全局变量通常不被认为是好的,而且总有办法绕过它们。请参阅为什么全局变量是邪恶的?.

于 2013-10-07T09:47:11.087 回答
0

你需要说from mod1 import var

为什么?

您的代码说from mod1 import,但是如果您查看此代码,则可以看出这是一个未完成的语句。你希望它导入什么?您必须指定。如果您不想执行更简单的过程import mod1,这将导入所有内容。

于 2013-10-07T16:35:20.047 回答
0

是的,我读过一篇文章,详细阐述了 mixins 的邪恶。就我而言,包含相互关联的函数(未使用类)的原始代码过于臃肿,以至于我决定将它们拆分为 2 个模块(B.pyC.py)。但是,这 2 访问了一些相同的变量,所以我将这些变量分解为A.py. 然后我包含依赖于和D.py中的函数的函数。依赖关系图如下所示:B.pyC.py

      A
    /   \
   B     C
    \   /
      D

(底部依赖顶部)

我没有充分的理由使用 mixins,它只是从 1 开始,我想我想将它们保持在同一个命名空间中,甚至分成四个模块。

刚才我想到了一个对每个变量使用getter和函数的解决方案。setter但我放弃了这个想法,因为它太笨拙了。

于 2013-10-08T03:28:33.687 回答
0

我不想要使用的解决方案import Modx.py

这不可能。做你想做的唯一方法是在另一个模块中重新绑定名称,这需要导入和访问模块而不是直接名称。

于 2013-10-07T09:47:00.367 回答