2013-01-03 13 views
5

でグローバルに代わる:私は現在、このようなコード持っているのPython

cache = 1 
def foo(): 
    global cache 
    # many 
    # lines 
    # of code 
    cache = 2 

読者がどこかglobal cache表示されていることに気付かないことがあるのでしかし、これは、将来的に見つけにくい、バグにつながる可能性を以上。あるいは、投稿者が間違ってdef bar(): cache = 2を追加して、global cacheを追加するのを忘れるかもしれません。

この落とし穴を避けるにはどうすればよいですか?

+1

正確に落とし穴とは何ですか?あなたは何を達成しようとしていて、何が効いていないのですか? – BrenBarn

+0

誰かが2番目の方法を書くとどうなりますか?それは依然としてローカル変数になります。あなたのコードに問題はありません。 – ATOzTOA

+2

'global'宣言がなければ変数はローカルです - もし '読者'がPythonで背景を持っていれば、それはローカルだと分かります。あなたが本当にしたいのであれば、ちょうどそれが地方か何かであると言うコメントを加えてください。 – Volatility

答えて

12
class Cache: 
    myvar = 1 

def foo(): 
    Cache.myvar = 2 

このように、Cache.myvarは実質的に「グローバル」です。どこからでも読み書きが可能です。

私は変数の名前の自動補完が可能なので、これを辞書の代わりに使用することをお勧めします。

+1

素晴らしい答え、エレガントで正確に私が探していたもの!ありがとうございました –

8
cache = 1 
def foo(): 
    return 2 
cache = foo() 

または

d = {'cache': 1} 
def foo(x): 
    x['cache'] = 2 
foo(d) 
3

「読者が意図せずにグローバル変数が更新されていると思うかもしれ」落とし穴の多くではありません。あなたのコードを読んでいる人は、Pythonの仕組みを知っていることを期待する必要があります。あなたはそれを明確にしたい場合は、コメントを使用してください。それが彼らのためのものです。

2

グローバル変数を使用するのは良いプログラミング方法ではありません。変数を引数として渡します。make関数は何かを返し、別の関数で使用します。関数は、Pythonがどのように動作するかを変数に代入することができます。

関連する問題