2013-04-10 18 views
6

私はモジュールから呼び出している関数を持っています。関数内で私がアクセスしようとしている2つの変数はグローバルになります。私が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

ちょうどこの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_これを行う。 –

+0

@ bruno desthuilliers:ありがとう、ありがとう。 –

+1

[PEP8](http://legacy.python.org/dev/peps/pep-0008/#imports)より*ワイルドカードのインポート( import *)は、どの名前が存在するのか不明確なので避けるべきです名前空間では、読者と多くの自動ツールを混乱させる... "* – SiHa

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 
関連する問題