Oscar と Martijn がすでに示した適切な回答に何かを追加しようと思います。
Python で関数を読み取るときは、どの関数でも、2 回読み取る必要があります。いつも。
最初のパスでは、次のことを行う必要があります。and 宣言ステートメントごとglobal
にnonlocal
、それらを (概念的に) 関数の先頭に移動します。
次のフォームの各ステートメントについて
* x = expr (or "x += expr", "x *= expr", etc.)
* for x in expr:
* with expr as x:
* def x(...):
* class x:
* import x (or "import foo as x")
* from some_module import x (or "from some_module import foo as x")
x という名前を見てください。それがglobal
ornonlocal
ステートメントで宣言されている場合は、そのままにしておきます。それ以外の場合は、宣言のandlocal
の直後に追加します。(pythonにはキーワードはありません。すべて概念的なものです)。関数パラメーターは常にローカルです。これらのステートメントの名前は、それらが参照するスコープと同様に、相互に排他的である必要があります。global
nonlocal
local
これが最初のパスでした。これで、座ってコードを読むことができます。変数名を目にするときはいつでも、これらの 3 つのステートメントでそれを調べます -global
とnonlocal
、私たちの架空のlocal
. 名前があれば、それがどこに属しているかがわかります。それ以外の場合は、囲んでいる関数で同じ方法で検索し、次にグローバル名前空間で検索します。そこにない場合は、組み込みまたはエラーである必要があります。
に対してそれを行うとupdate()
、次のようになります。
def update():
local testing # not real python code
print "UPDATED"
testing = 2
ええと、それはあなたが意図したものではありませんよね?
前の別の例:
x=3
def print5():
for i in range(5):
print(x)
x += 1
後:
x=3
def print5():
local i, x
for i in range(5):
print(x) # oops. x is local but was not assigned!
x += 1
私が説明したアルゴリズムは完全ではないことに注意してください。except
句の名前のみを非表示にする例外を省略しました。eval
そしてexec
; とfrom some_module import *
。
完全な情報については、次のドキュメントを参照してください: http://docs.python.org/2/reference/executionmodel.html#naming-and-binding