1

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は役に立ちすぎました。

4

1 に答える 1