私はクロージャがPythonでどのように動作するかを理解しようとしています。Pythonのクロージャー - ローカル変数が代入の前に参照されています
add1はここでうまく動作するはずです。 helper
が呼び出されたときに変数x
が定義されていると思います。しかし、それは私にLocal variable referenced before assignment
エラーを与えています。
add2
は、add1
と非常に似ています。 xに整数を代入するのではなく、xに整数を代入します。それの振る舞いは、私が期待しているものと一直線に並んでいます。 x
が定義され、参照可能な内部はhelper
です。
import random
def add1():
x = 0
def helper():
x = x + 1
return x
return helper
def add2():
x = {}
def helper():
x[random.randint(1,1000)] = 3
return x
return helper
if __name__ == '__main__':
a1 = add1()
a2 = add2()
# print(a1()) #This causes error
print(a2()) #{650: 3}
print(a2()) #{650: 3, 333: 3}
これの背後にある論理は何ですか? x
の種類が異なる以外は、私は何をしていますか?
あなたは関数リファレンスを返していますが、実際にはヘルパーは実際には呼び出されません。 – TigerhawkT3
それを変更しても、毎回新しい辞書 'x'が定義されているので、その後の' a2() 'の呼び出しで追加のキーと値のペアを得ることはありません。 – TigerhawkT3
@ TigerhawkT3「どちらもヘルパーが実際に呼ばれていない」ということについてもっと詳しく説明できますか?それが呼び出されない場合、なぜ呼び出す 'a2'は毎回新しい値を辞書に追加しますか? – denniss