0

Mark Lutz による「Learning Python」で、「関数は、構文的に囲まれた関数とグローバル スコープで割り当てられた名前を自由に使用できますが、それらを変更するには、そのような非ローカルとグローバルを宣言する必要があります」と読みました。Python 2.7 でそれらをテストできませんでした。

def f1():
    f1_a = 'f1_a'
    def f2():
 #       global f1_a
 #       nonlocal f1_a
        f2_a = 'f2_a'
        print 'f2_a={:s}'.format(f2_a)
        print 'f1_a={:s}'.format(f1_a)
        f1_a = 'f1f2_a'

    f2()
    print 'f1_a={:s}'.format(f1_a)

>>> f1()

エラーが発生します:

UnboundLocalError: local variable 'f1_a' referenced before assignment

'global' (NameError: グローバル名 'f1_a' が定義されていません) および 'nonlocal' (非ローカル f1_a 、SyntaxError: 無効な構文) は機能しません。これは、外側の関数で導入された変数を内側の (すぐに囲まれた) ものから変更する方法がないことを意味しますか?

4

3 に答える 3

1

Blcknght の答えは、あなたが望むものを達成する方法を提供しますが、 f2 関数内で f1_a 変数 (f1 で定義されている)を再バインドするために例外が発生することを強調したいと思います。

囲まれたものから外部関数変数にアクセスできます。

内部関数で f1_a の新しいバインディングを削除すると、コードは Python 2.7 で動作します。

def f1():
    f1_a = 'f1_a'
    def f2():
        f2_a = 'f2_a'
        print 'f2_a={:s}'.format(f2_a)
        print 'f1_a={:s}'.format(f1_a)
        # f1_a = 'f1f2_a'

    print 'f1_a={:s}'.format(f1_a)
    f2()

>>> f1()
f1_a=f1_a
f2_a=f2_a
f1_a=f1_a

このスニペットは、

f1_a を別のオブジェクトに再バインドすると、コードが壊れます

したがって、元の質問に関しては、内部関数から外部関数の属性にアクセスできます。コンテナ内の値を変更することもできます。しかし、不変変数を再バインドすると問題が発生します。

于 2018-04-11T08:34:32.453 に答える