Python 我是否可以要求导入的模块修改main.py';什么是环球?

Python 我是否可以要求导入的模块修改main.py';什么是环球?,python,module,global-variables,Python,Module,Global Variables,显然,这是行不通的: #module.py def modifyglobals(): global a a = 12 #main.py from module import modifyglobals modifyglobals() print a # NameError: name 'a' is not defined 因为我认为它修改的是module.py,而不是main.py 另一方面,我希望这会奏效: #module.py def modifyglobals(g):

显然,这是行不通的:

#module.py
def modifyglobals():
    global a
    a = 12

#main.py
from module import modifyglobals
modifyglobals()
print a  # NameError: name 'a' is not defined
因为我认为它修改的是
module.py
,而不是
main.py

另一方面,我希望这会奏效:

#module.py
def modifyglobals(g):
    g()['a'] = 12

#main.py
from module import modifyglobals
modifyglobals(g=globals)  # pass a reference to **main's globals** to modifyglobals
print a
但它仍然给出了
NameError:没有定义名称“a”


问题:为什么
main.py
不传递对其自身全局变量的引用,以便被调用函数可以修改
main.py
的全局变量?

如果您想访问模块的全局变量,可以执行以下操作:

# module.py
def modifyglobals():
    global a
    a = 12

# main.py
import module

module.modifyglobals()
print(module.a)
如果您想修改main.py的全局设置,您可以这样做:

# module.py
def modifyglobals(mod):
    mod['a'] = 12

# main.py
import module

a = None

module.modifyglobals(globals())
print(a)
也就是说,我真的不鼓励你使用这两种方法。就我个人而言,我很少考虑模块全局的用法。如果我决定定义模块globals,要么是因为我将使用它们在模块级别上是私有的,要么是作为单例、模块的常量或模块的缓存。有更好的方法在模块之间进行数据传输,不应使用上述方法

为什么
main.py
不传递对其自身全局变量的引用,以便被调用函数可以修改
main.py
的全局变量?

因为
g=globals
传递的是
globals
函数,而不是任何特定的全局变量dict。当调用
globals
时,它返回被调用的任何代码的全局变量dict。您仍然会在
module.py
中而不是在
main.py
中调用
globals
,因此您会得到
module.py
的globals

传递实际全局变量dict:

#module.py
def modifyglobals(g):
    g['a'] = 12

#main.py
from module import modifyglobals
modifyglobals(g=globals())
print a

当然,大多数情况下,让函数直接修改其调用者的全局变量是个坏主意。实际上不要这样做。

是和否,因为这样我就必须在每个变量前面加上
模块。
。在像
X+Y*Z+…
这样的长计算中,我希望避免长时间编写
module.X+module.Y*module.Z+…
@Basj编辑我的answer@Basj:在这样的计算中,您可能不应该使用任何一个模块的全局变量。您应该使用局部变量和函数返回值。非常感谢!事实上,在99999%的Python代码中,我从来没有这样做过,我知道这不是一个好主意。只是在一个特别棘手的情况下,它会简化很多事情。谢谢你的帮助!