Python - 将全局变量赋值给函数返回需要函数是全局的吗?

时间:2010-07-29 03:03:07

标签: python function module variables global

所以,我很困惑。我有一个包含我在另一个模块中使用的函数的模块。像这样导入:

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

3 个答案:

答案 0 :(得分:3)

以你完成它的方式做import *是一个单向过程。你输入了一堆名字,就像你做的一样:

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

因此,他们都被分配到import完成的模块的全局范围内的名称。这不做的是连接这两个模块的全局命名空间。 global表示 module-global ,而非全局到所有模块。因此,每个模块可能都有自己的fubar全局变量,并且分配给一个模块不会分配给每个模块。

如果要从其他模块访问名称,则必须将其导入。所以在这个例子中:

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

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

答案 1 :(得分:0)

好吧,我不能评论这里的任何帖子,这个解决方案不起作用。我想澄清一点。

这里有两个模块:

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

现在,给出的解决方案对我不起作用,这是一个我真正想要解决的问题。

答案 2 :(得分:0)

def changeBar()

需要:

def changeBar(bar)

在main.py

中调用changeBar(bar)时的方式

functions.py适用于main.py

中的bar变量

...的sooo

from functions import *

bar = 20
print bar
bar = changeBar(bar)
print bar

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

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