0
def closure():
    a = 2
    def f():
        if a < 5:
            print a
    return f

closure()()

閉じた変数を読み取ることができるので、私には理にかなっています。

def closure():
    a = 2
    def f():
        if a < 5:
            a += 1
            print a
    return f

closure()()

になりますFile "closure_problems.py", line 4, in f if a < 5: UnboundLocalError: local variable 'a' referenced before assignment

閉じた変数に代入できないことを知っているので、それは私にとっても理にかなっています。if a < 5しかし、行番号が実際の問題のあるステートメントであると思われるものの代わりに参照しているのは奇妙ですa += 1.

この

def closure():
    a = 2
    def f():
        if a < 5:
            print a
            a += 1
    return f

closure()()

結果は のみになりFile "closure_problems.py", line 4, in f if a < 5: UnboundLocalError: local variable 'a' referenced before assignmentます。2それは私がまったく理解していない印刷さえしません。

インタープリターは、ブロック内のすべてを (評価せずに) 解析して、ローカルaまたはグローバルのどちらについて話しているのかを調べようとしていますか?

4

1 に答える 1

2

関数で代入aすると、関数aのローカル変数になりf()ます。ただし、割り当てる前に使用することはできません。そのため、if a < 5ステートメントでエラーが発生します。

インタープリターは、ブロック内のすべてを (評価せずに) 解析して、ローカルの a について話しているのか、グローバルな a について話しているのかを調べようとしていますか?

はい。

というか、やってみるしかない。

于 2013-08-30T02:18:00.650 に答える