2010-07-29 126 views
1

所以,我很困惑。我有一个模块包含一些我在另一个模块中使用的函数。像这样导入:Python - 将全局变量赋值给函数返回需要函数为全局变量?

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

提示:不要使用全局变量。他们是一个糟糕的主意。这是一个很好的例子。他们很难使用。所以不要使用它们, – 2010-07-29 03:21:27

+0

全局变量是邪恶的。导入*是邪恶的。邪恶会引起混乱。 – 2010-07-29 03:25:58

回答

3

以您所做的方式做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) 

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

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

现在,给出的解决方案不适合我,这是一个我真的很喜欢解决方案的问题。

0

高清changeBar()

需求是:

高清changeBar(巴)

,当你调用方式changeBar在main.py

functions.py作品(巴)从主变量栏变量。PY

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