Python - 将全局变量赋值为函数返回值需要函数也全局吗?

1 投票
3 回答
6730 浏览
提问于 2025-04-16 02:00

我有点困惑。我有一个模块,里面有一些函数,我在另一个模块里使用这些函数。导入的方式是这样的:

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

你需要把这个函数定义改成这样:

def changeBar(bar)

这样,当你在main.py里调用changeBar(bar)的时候,

functions.py就可以使用main.py里的bar这个变量了。

所以……

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
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

现在,给出的解决方案对我来说不管用,我真的很想找到一个解决办法。

3

你用的这种方式做 import * 是单向的。你导入了一堆名字,跟这样做差不多:

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

这些名字都被分配到了你导入的那个模块的全局范围内。也就是说,它们在这个模块里是可用的。但是,这样做并不会把这两个模块的全局命名空间连接起来。这里的 global 是指模块级别的全局,而不是对所有模块都全局的。所以每个模块可能都有自己的 fubar 这个全局变量,给一个模块的变量赋值并不会影响到其他模块。

如果你想从另一个模块访问某个名字,你必须先导入它。所以在这个例子里:

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

在函数内部进行导入,可以避免循环导入的问题。

撰写回答