2013-04-10 171 views
6

我有一個函數,我從模塊調用。在函數中,我試圖訪問的兩個變量是全局的。當我單獨運行IDLE模塊時,我仍然可以在函數結束後訪問變量,如預期的那樣。當我將模塊導入到代碼中的函數中時,我無法訪問這些變量。訪問導入模塊中函數的全局變量

#module to be imported 

def globaltest(): 
    global name 
    global age 
    name = str(raw_input("What is your name? ")) 
    age = int(raw_input("What is your age? ")) 

當我自己運行它時的輸出。

>>> globaltest() 
What is your name? tom 
What is your age? 16 
>>> name 
'tom' 
>>> age 
16 

並在其中導入它的代碼。

import name_age 

name_age.globaltest() 

但是當我運行試圖訪問我導入它的代碼中的變量。

What is your name? tom 
What is your age? 16 
>>> name 

Traceback (most recent call last): 
File "<pyshell#10>", line 1, in <module> 
name 
NameError: name 'name' is not defined 
>>> 

我怎樣才能讓在我已導入模塊或訪問「名稱」,或在功能「年齡」變量代碼變量全球。

回答

1

只要改變你的import聲明這一個:

from name_age import * 

例如:

In [1]: from name_age import * 
In [2]: print name 
Out[2]: 'tom' 

否則,如果你想使用import name_age語句,那麼你必須訪問global變量通過模塊名稱參考,即:

例如:

In [1]: import name_age 
In [2]: print name_age.name 
Out[2]: 'tom' 
+2

星級進口大約爲邪惡的全局。 @badathings:_dont_這樣做。 – 2013-04-10 11:45:43

+0

@bruno desthuilliers:好的,謝謝。 – 2013-04-10 11:46:46

+1

從[PEP8](http://legacy.python.org/dev/peps/pep-0008/#imports)*「應避免使用通配符導入(從導入*),因爲它們不清楚哪些名稱存在在命名空間中,混淆了讀者和許多自動化工具......「* – SiHa 2014-06-20 07:14:29

3

簡單的答案是 「不」。 Python的「全局變量」只是模塊級的全局變量,甚至應該儘可能地避免模塊級的全局變量(可變模塊級全局變量),而使用它的真正原因非常之少。

正確的解決方案是學會正確使用函數參數和返回值。在你的情況下,第一種方法是

#module.py 

def noglobaltest(): 
    name = str(raw_input("What is your name? ")) 
    age = int(raw_input("What is your age? ")) 
    return name, age 

然後:

from module import noglobaltest 

name, age = noglobaltest() 
print "name :", name, "age :", age