この記事では、「Python クロージャと非ローカル」の使用法を紹介します。非ローカルは Python3.0 の新しいキーワードであり、python2.x はサポートを提供していないためです。この記事では、Python2.x でネストされた関数を解決することを提案しています。これは、外部を参照する唯一の方法です。変数を使用するには、global キーワードを使用してグローバル変数を定義します。もう 1 つの実現可能な解決策は、操作するキーワードの代わりにリストまたは辞書を使用することです。
例は次のとおりです: 非ローカルキーワードを使用する
1.python3.0
>>> def outer(): x = 1 def inner(): nonlocal x x = 2 print("inner:", x) inner() print("outer:", x) >>> outer() inner: 2 outer: 2
2.python2.x は list または dict で実装されます
>>> def outer(): x = [1] def inner(): x[0] += 1 #修改x[0]保存的值 print("inner:", x[0]) inner() print("outer:", x[0]) >>> outer() inner: 2 outer: 2
:
1 http://stackoverflow.com/questions/1261875/python-nonlocal-statement
2. JavaScript のスコープチェーン定義と Python スコープの類似点と相違点
3. 公式ドキュメント:
「非ローカルステートメントにより、リストされたバインドのデフォルトの動作では、最初にローカル名前空間を検索するため、このステートメントにより、カプセル化されたコードがグローバル (モジュール) スコープ以外のローカル スコープの外側にある変数を再バインドできるようになります。 .
非ローカル ステートメントにリストされる名前は、グローバル ステートメントにリストされる名前とは異なり、外側のスコープ内の既存のバインディングを参照する必要があります (新しいバインディングを作成するスコープを明確に決定することはできません)。非ローカルなステートメントにリストされているものは、ローカル スコープ内の既存のバインディングと衝突してはなりません。"