2016-07-11 15 views
0

IPythonから関数を実行し、すべてのデータを対話型の名前空間にロードしたいと思います。%run filename.pyのようにします。例えば、ここにファイルscratch.pyです:IPythonで%IPythonでPython関数を実行する

def foo(x): 
    a = x*2 

が、私はこの関数を実行し、名前aにアクセスできるようにしたいと思います。これを行う方法はありますか?

答えて

1

グローバル(またはいくつかのインタラクティブIPythonセッションで)変数を使用できるようにするためには、あなたが最初のグローバルとして定義する必要があります。

def foo(x): 
    global a 
    a = x*2 

そうでなければ、あなたのaはあなたの関数内のローカル変数のまま。より多くの情報ここでは:Use of “global” keyword in Python

+0

IPythonから 'foo'を呼び出して' a'にアクセスするにはどうしたらいいですか?私は最初から 'foo(2)'を試しましたが、定義されていないということを 'a'と打つとNameErrorを取得します。 – bcf

+0

関数の最後に 'return a'を追加します。 – Sosel

0

これはipythonまたは%runの問題ではなく、関数で作成された変数でできることの質問です。 Pythonで実行されるすべての関数に適用されます。

関数にはlocalという名前空間があり、そこにはその関数で定義した変数が置かれます。つまり、関数によってローカルに設計されています。呼び出し元の名前空間(モジュールのグローバルまたは呼び出し関数のローカル)に「流出」することは想定されていません。これは、関数を使うことからの主要な理由です - 関数を呼び出し元から変数を分離することです。

あなたはいくつかのことを行うことができます関数内の変数を参照する必要がある場合:(デバッグ目的のために、一時的な)

  • 使用グローバル(貧しいデザインの多くの場合、記号)
  • 使用ローカルプリントを
  • 値を返す(通常の使用法)
  • デバッガを使用します。

これは役に立たない機能である:これはすっきりとしたデザインでは、いくつかの値

def foo(x): 
    a = x*2 
    return a 

def foo(x): 
    a = x*2 
    print(a)  # temporary debugging print 
    # do more with a and x 
    return ...  

を有していてもよい

def foo(x): 
    a = x*2 

、関数は側を最小限に抑えて、引数を取り、その値を返します効果。グローバル変数を設定することは、コードのデバッグをより困難にする副作用です。