http://pydanny.com/python-dictionary-as-a-class.htmlで以下のコードを見つけました。コードは正常に動作し、その理由は理解できますが、その下にある同様のコードでエラーが発生します。
def newclass(**kwargs):
""" Use kwargs.update() method to handle inheritance """
def set(key, value):
""" Sets key/value to the kwargs.
Replicates self/this clumsily
"""
kwargs[key] = value
kwargs['set'] = set
return kwargs
私の試用コード:
def closing():
x=1
def closed():
print(x)
x=x+1
return(closed)
a=closing()
a()
エラーメッセージ:
Traceback (most recent call last):
File "<pyshell#606>", line 1, in <module>
a()
File "<pyshell#604>", line 4, in closed
print(x)
UnboundLocalError: local variable 'x' referenced before assignment
クローズド関数で「nonlocal x」を使用すると機能しますが、「nonlocal」なしで最初のコードが機能するのはなぜですか。私の理解では、それはクロージャーであり、内側の関数は外側の(フリー)変数の参照を保持し、内側の関数が呼び出されるたびに、その閉じた変数に作用することができますが、確かにその一部を正しく理解していません. 私が欠けている概念を明確にするのを手伝ってください。回答者の皆様、ありがとうございます。SOは役に立ちすぎました。