2016-09-25 14 views
0

目標:別の関数でローカル変数を使用する必要があります。それはPythonで可能ですか?別の関数でローカル変数にアクセスすることは可能ですか?

他の機能でローカル変数を使用したいと思います。私の場合は、カウンタを使用して接続の数と接続の数を表示する必要があるので、カウンタを維持しています。これを実装するために、私はcountのサンプルコードを書いて、別の関数でローカル変数を返します。

t & my_replyは、test()の機能でどのように印刷できますか?

コード:counter_glob.py

my_test = 0 
t = 0 

def test(): 
    print("I: ",t) 
    print("IIIIIIII: ",my_reply) 

def my(): 
    global t 
    reply = foo() 
    t = reply 
    print("reply:",reply) 
    print("ttttt:",t) 

def foo(): 
    global my_test 
    my_test1 = 0 
    my_test += 1 
    print my_test1 
    my_test1 = my_test 
    my_test += 1 
    print("my_test:",my_test1) 
    return my_test1 

my() 

結果:

> $ python counter_glob.py 
0 
('my_test:', 1) 
('reply:', 1) 
('ttttt:', 1) 
+0

「ローカル」という意味ではありません。それに加えて、あなたのコードのどこにでも 'my_reply'という名前の変数は定義しません。サンプルコードで – martineau

+0

、私は自分の関数を持っています、私はグローバル変数に返信を割り当てています。私の関数でグローバル変数を印刷するとき、つまりt。期待どおりの値を印刷します。私はなぜテスト機能では印刷されていないのか分からないのですか?私の関数ではtが返信で更新されているからです。 –

+0

関数 'my()'では、 'reply'という名前のローカル変数に値を割り当て、それを' t'という名前のグローバル変数に代入します。 'test()'関数ではグローバル変数 't'を参照し、どこにも定義されていない' my_reply'という名前を付けます。 'my_reply'は、他の関数のローカル変数' reply'の別の名前ではありません。あなたはそれをすることはできません。 [my answer](http://stackoverflow.com/a/19327712/355230)に示されている手法を使って 'my()'に関数属性を作成し、 'test()'にアクセスすることができます。これにより、 'my.reply'を定義することができます。 – martineau

答えて

0

私が知っているように、あなたは機能外部ローカル変数へのアクセスを得ることができません。しかし、あなたが私の意見では、それは悪い習慣になることができます。

なぜ機能やクラスを使用しないでください。

connections = 0 

def set_connection_number(value): 
    global connections; connections = value; 

def get_connection_number(): 
    global connections; 
    return connections; 

# test 
set_connection_number(10) 
print("Current connections {}".format(get_connection_number())) 
1

機能のローカルスコープにアクセスするには、さまざまな方法があります。 locals()を呼び出すことで、ローカルスコープ全体を返すことができます。これにより、関数のローカルスコープ全体が得られます。ローカルスコープを保存するのは非典型的です。

def test(): 
    print("I: ", my.t) 
    print("IIIIIIII: ", my.reply) 

def my(): 
    my.reply = foo() 
    my.t = m.reply 
    print("reply:", my.reply) 
    print("ttttt:", my.t) 

あなたは今通常treplyアクセスすることができます:あなたの機能のために、あなたは機能自体に必要な変数、func.var = valueを保存することができます。あなたの関数をmyreplyと呼び出すたびに、fooが返すものはmy.replyに割り当てられます。

0

closureを除き、機能範囲外のローカル変数にはアクセスできません。 変数が異なるメソッド間で共有される必要がある場合は、@ pavnikが言及したように、変数をグローバルにする方がよいでしょう。