无法从导入的模块更改全局变量。

3
我在module1中声明了一个函数。
from shared import *
def foo():
  global a
  print('in :',a)
  a=0
  print('out:',a)

还有一个共享模块:

a=1

所以我正在启动Python3解释器:
>>> from module1 import *
>>> a
1
>>> foo()
in : 1
out: 0
>>> a
1

为什么 a 仍然是1?
1个回答

2

嗯,我本来以为这个问题的答案已经存在了,但是我好像找不到。那么,这就是答案:

from shared import *shared模块中所有(导出的)字段导入当前命名空间。它通过迭代模块中的字段,并使用与模块中相同名称的变量将变量分配到当前命名空间中。

>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
>>> from shared import *
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'a']

请注意,我们当前的命名空间现在包含一个名为 a 的变量。
虽然该 a 的值与 shared.a 相同(自导入以来),但两者之间没有进一步的连接。如果您在命名空间中重新分配 a,这对导入的模块没有影响。
实际上,如果您再次从模块中提取名称,您将覆盖本地值:
>>> a = 5
>>> a
5
>>> from shared import a
>>> a
1

谢谢您的解释!那么我该怎么处理呢?拒绝使用 import *,改用 shared.a 吗? - iliaos
1
@Iliaspice,如果您想重新分配shared.a,那基本上这是您唯一的选择。 - dhke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接