2016-05-12 6 views
0

私は入力を受け取り、処理してから出力を返す関数があるモジュールを持っています。このモジュールの関数を呼び出すと動作するように見えますが、メインプログラムから変数 'result'にアクセスすることはできません。関数内のグローバル変数にアクセスする方法は?

file_a.py:

result = False 
def test(incoming): 
    if incoming > 3: 
     result = True 
    else: 
     result = False 
    print(result) 
    return result 

file_b.py:test()内からresultに問い合わせる

import file_a 
for i in range(5): 
    file_a.test(i) 
    print(i, file_a.result) 

が所望の結果を生成する(予想される場合、すなわち、それがTrueに変更)が、メインループからfile_a.resultは常にFalseです。

答えて

0

何が起こっているのかは、関数内の変数resultがこの関数のスコープ内にのみ存在するバージョンであることです。そのように、グローバルとしてresultを宣言してみてください。

result = False 
def test(incoming): 
    global result # declare result as global 
    if incoming > 3: 
     result = True 
    else: 
     result = False 
    print(result) 
    return result 
1

あなたはグローバルVを見ている必要がありますローカルの名前空間をPythonで、例えば。 this random site I found

主なポイントは、関数内にローカル変数 'results'を定義することです。これを変更するとでなく、は外部(グローバル)変数の結果を変更します。これを変更するには、変数 'result'がグローバル変数であると関数に指示します。関数の最初の行に 'global result'を入れるだけです。

result = False  
    def test(incoming): 
    global result 
    ... 

これで解決します。

+0

これは正しいです。しかし、あなたが実際にやろうとしていることに応じて、ローカルとして残して、file_b(file_a.test(i)をa = file_a.test(i)に変更してからaを返します関数呼び出しによって呼び出すことができます。 'a'ではなく 'return'と呼ぶこともできます。 – ViennaMike

0

あなたが探している答えは、file_aのメソッドの中でglobal resultを使用して、pythonにグローバルなものであることを伝えることです。しかし、これはあなたのコードのために働くだけです。私はあなたの実装が間違っている(と危険な)と言うでしょう。

このシナリオでは、関数呼び出し中に変数を割り当てないのはなぜですか?あなたは返品を提供しており、それを使用することはありません。

file_a.py

def test(incoming): 
    if incoming > 3: 
     result = True 
    else: 
     result = False 
    print(result) 
    return result 

file_b.py

import file_a 
for i in range(5): 
    result = file_a.test(i) 
    print(i, result) 

グローバル変数空間を汚染する理由はないように思えます。この種の機能が本当に必要な場合は、クラスを使用する必要があります。このモジュールを使用しているモジュールが2つあるとすぐに、状況が悪くなる可能性があります。他の人の呼び出し結果を使用し始めます。

また、テストでは、同じテスト値を返すようブール値をテストしています。これは冗長であり、より簡単に書くよりも、パースするのに脳力が必要です。

def test(incoming): 
    return incoming > 3 
関連する問題