C/C では、静的変数は関数呼び出し全体で値を保持する上で重要な役割を果たします。ただし、Python には、この概念に相当する明示的な概念がありません。したがって、Python 関数内で静的変数を効果的に実装するにはどうすればよいでしょうか?
Python の慣用的なアプローチには、クラスレベルの変数の操作が含まれます。これは、関数とそれに関連付けられた状態をカプセル化するクラスを定義することで実現できます。ただし、クラスの使用が望ましくないシナリオでは、代替メソッドを使用する必要があります。
1 つの回避策には、以下に示すように、関数の名前空間を利用することが含まれます。
def foo(): if not hasattr(foo, "counter"): foo.counter = 0 foo.counter += 1 print("Counter is %d" % foo.counter)
このコード スニペットは、以下の中でカウンターを定義します。関数の名前空間を定義し、呼び出し間で名前空間が保持されるようにします。ただし、最初の呼び出し時に明示的な初期化が必要です。
より簡潔でカスタマイズされたアプローチとして、デコレータを使用できます。次のデコレータは静的変数を作成し、指定されたキーワード引数に基づいて初期化します:
def static_vars(**kwargs): def decorate(func): for k in kwargs: setattr(func, k, kwargs[k]) return func return decorate
このデコレータは次のように利用できます:
@static_vars(counter=0) def foo(): foo.counter += 1 print("Counter is %d" % foo.counter)
このデコレータを利用することで、カウンタの初期化コードを関数定義の先頭に配置できるため、より直観的で読みやすい実装が可能になります。
以上がPython 関数で静的変数をシミュレートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。