2010-07-29 125 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