所以,我很困惑。我有一个模块,其中包含一些在其他模块中使用的功能。像这样导入:

from <module> import *


在我的模块内部,有一些功能旨在在主程序中设置全局变量。

main.py:

from functions import *

bar = 20
print bar
changeBar()
print bar


functions.py:

def changeBarHelper(variable):
    variable = variable * 2
    return variable

def changeBar():
    global bar
    bar = changeBarHelper(bar)


现在,这是一个简化,但是它是产生相同结果的最少代码:

Traceback (most recent call last):
  File "/path/main.py", line 5, in
        changeBar()
  File "/path/functions.py", line 7, in changeBar
    bar = changeBarHelper(bar)
NameError: global name 'bar' is not defined

最佳答案

按照您的方式执行import *是单向过程。您已经导入了一堆名称,与您导入的方式大致相同:

from mymodule import foo, bar, baz, arr, tee, eff, emm


因此,它们都只是分配给完成import的模块的全局范围中的名称。这不做的是连接这两个模块的全局名称空间。 global表示全局模块,而不是所有模块全局。因此,每个模块可能都有自己的fubar全局变量,分配给一个全局变量不会分配给每个模块。

如果要从另一个模块访问名称,则必须导入它。因此,在此示例中:

def foo(var1, var2):
    global bar
    from mainmodule import fubar
    bar = fubar(var1)


通过在函数本身内部进行导入,可以避免循环导入。

关于python - Python-将全局变量分配给函数返回是否要求函数是全局的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3359204/

10-15 22:34