0

python3.3で:

x = 1
print('global x =', x)
def f():
    exec('x=2')
    #x = 2
    print('local in f() x =', x)
    def g():
        print('local in g() x =', x)
    g()

f()

python3.3では、なぜresulsがこのようになるのですか:

    global x = 1
    local in f() x = 1
    local in g() x = 1

なぜ exec('x=2') in not equal x=2 か教えてください

'x=2' と exec('x=2') の違いは何ですか?

3倍

4

1 に答える 1

1

関数内のローカルは高度に最適化され、コンパイル時に決定され、フレームの配列に格納されます。各ローカル名は、バイト コード内の単なるインデックスであり、その配列にインデックスを付けます。

exec()一方、ローカルを書き込み可能な辞書として扱おうとしますが、関数内では、によって返される辞書は関数locals()の実際のローカル配列に接続されていません。で locals を設定することはできませんexec()

locals()関数のドキュメントを引用する:

: この辞書の内容は変更しないでください。変更は、インタープリターによって使用されるローカルおよびフリー変数の値に影響しない場合があります。

そしてexec()関数から:

: デフォルトローカルは、以下の機能で説明されているように動作します。デフォルトローカルlocals()ディクショナリへの変更は試行しないでください。関数が戻った後にコードがローカルに与える影響を確認する必要がある場合は、明示的なローカル ディクショナリを渡します。exec()

x = 2関数内に行を追加するxと、コンパイラによってローカルであると判断されます。

于 2014-01-28T15:24:42.997 に答える