9

TL; DR:包含スコープを検索するlocals()が必要です。

こんにちは、みんな。

私は何人かの化学者の友人にPythonプログラミングのコースを教えています、そして私は私がスコープを本当に理解していることを確認したいと思います。

検討:

def a():
    x = 1
    def b():
        print(locals())
        print(globals())
    b()

ローカルは空の環境を出力し、グローバルは通常のグローバルを出力します。xが保存されている環境にアクセスするにはどうすればよいですか?私がそれを参照できるので、明らかに通訳はそれについて知っています。

関連:スコープはいつ発生しますか?x = 3が含まれている場合にのみ、a = x+2で次のnameErrorsが発生します。

def a():
    x = 1
    def b():
        a = x+2
        x = 3
    b()

x = 3をコメントアウトすると、コードは機能します。これは、Pythonがコードを解釈する前に字句スコープがコードを通過させることを意味しますか?

4

3 に答える 3

6

あなたのコードで起こっていることは、Pythonがあなたのメソッドのx=3行を見るとき、それは関数のスコープで使用するのではなく、関数内のスコープで再作成しているということです。b()xbxa

あなたのコードが行くので:

    a = x+2
    x = 3

参照する前に、内部スコープを定義する必要があると言っていますx

ただし、関数x内にの割り当てがない場合、 bPythonはスコープを低くしようとせずx、エラーをスローしません。

次のコードはこれを示しています。

def a():
    x = 1
    def b():
        x = 3
        print (x)

    def c():
        print (x)

    b()
    c()
    print (x)

a()

ただし、次のように、関数内で使用できるように宣言する場合はx、次のようになります。global

def a():
    global x
    x = 1

    def d():
        global x
        x += 2

    print (x)
    d()
    print (x)

a()

Python 3にはnonlocal、囲んでいるスコープから変数にアクセスできるキーワードも追加されています。使用法は次のようになります。

def a():
    x = 1

    def d():
        nonlocal x
        x += 2

    print (x)
    d()
    print (x)

a()

例と同じ結果を出力しglobalます。


質問を読み間違えた場合:

Pythonで名前空間を呼び出すことからローカルを取得するための答えに従って:

使用できます:

import inspect

def a():
    x = 1

    def d():
        frame = inspect.currentframe()
        try:
            print (frame.f_back.f_locals)
        finally:
            del frame
    d()

a()

関数呼び出し元のローカルスコープを取得します。

于 2013-02-25T22:36:15.330 に答える
1

ステートメントprint(locals())は、最も近い囲みスコープ、つまりdef b():関数を参照します。を呼び出すとb()、この b 関数にローカル変数が出力され、 x の定義はスコープ外になります。

def a():
    x = 1
    def b():
        print(locals())
        print(globals())
    b()
    print(locals())

x をローカル変数として出力します。

2 番目の質問:

def a():
    x = 1
    def b():
        #a = x+2
        x = 3
    b()

>>> a()

エラーは発生しません。

def a():
    x = 1
    def b():
        a = x+2
        #x = 3
    b()

>>> a()

エラーは発生しません。

def a():
    x = 1
    def b():
        a = x+2
        x = 3
    b()

>>> a()

次のエラーが発生します。UnboundLocalError: local variable 'x' referenced before assignment

IMO (確認してください)、この 3 番目のケースでは、本体の最初のステートメントは、最も外側のスコープ内b()の x の値を検索します。そして、このスコープでは、次の行に x が割り当てられます。ステートメントのみがある場合、 x はほとんどの囲みスコープでは見つからず、「次の」囲みスコープで見つかります。a = x+2x = 1

于 2013-02-25T22:27:17.903 に答える