2012-01-13 7 views
-1

one.pyです:Pythonで他のモジュールで変数を使うにはどうすればいいですか?

test = {'1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]} 
import two 
two.example() 

そして、それはtwo.pyです:これは次のエラーで失敗する理由

def example(): 
    print test[1][5] 

あなたは私を伝えることができますか?

NameError: global name 'test' is not defined 

ありがとうございます!

+2

Pythonでの 'import'は、他の言語では' include'と似ていません。 'import two'は' two'というモジュールオブジェクトシングルトンを作成し、その内容はtwo.pyのコードから初期化されます。これは "two.py"の内容を解析ストリームにコピーしません! –

答えて

-1

あなたは機能

def example(): 
    from one import test 
    print test[1][5] 

でそれをインポートすることができますまたはあなたは、Pythonで変数

#one.py 
two.example(test) 

#two.py 
def example(test): 
    print test[1][5] 
+0

関数内の 'import'はうまく動作しません!そのprintステートメントは複数回実行されます。 –

+0

いいえ、複数回はインポートされません。モジュールは1回だけ実行されます。その後、すでにインポートされたモジュールが使用されます。 – kindall

+0

@kindall: 'one.py'が実行されるようです:' $ python one.py'なので、 'example()'関数が2回呼び出されるので、 '6'もまた呼び出されます2回印刷! * '__name__ == '__main __''文を使わないで "メインコード"を実行するモジュールからのインポートが悪い*メインファイルからのインポートを提案していないので、3つのファイル5行のコードでは、私の意見は残っています:**相互インポートは悪いアドバイスです**。 –

0

すべてのモジュール(スクリプトのテキストを含む)には、グローバル変数(global symbol table)の独自の名前空間があります。他のモジュールの変数にアクセスすることは可能ですが、簡単ではありません。さらに、通常、より良い方法は、それらを関数の引数として渡すことです。

0

名前空間に入れるためには、two.pyファイル内のone.pyをインポートする必要があります。

Two.py:

from one import * 
print test 
+0

one.pyをモジュールとして使用すると、これは動作します。それ以外の場合(スクリプトとして実行されている場合)、one.pyは今度はモジュールとして2回目に実行されます。これはおそらく必要ではないでしょう。 – Tanriol

+4

'from xxx import *'はPythonの良い習慣ではありません – juliomalegria

+0

@TanriolはすぐにiPhoneに書きました。 one.pyは 'if name ==" __main__ ":#do something'を持っていなければなりません。 – Tehnix

1

あなたtwo.pyがtestが何であるかを知らないので、あなたがexampleにパラメータとしてそれを渡す必要があります:

one.py:

test = {1: [1, 2, 3, 4, 5, 6]} 
import two 
two.example(test) 

two.py:

def example(test): 
    print test[1][5] 

注:test[1][5]なくtest['1'][5]と呼ばれているので私は'1'から1にごtest辞書のエントリを変更する自由を取りました。

1

としてテスト渡すことができ、すべてが対象です。 偶数モジュール

testoneモジュールオブジェクトの属性であり、twoモジュールオブジェクトの属性ではありません。したがって、twoのコードでは、範囲外です。

関連する問題