3

些細な例があります:


def func1():
    local_var = None

    def func(args):
        print args,
        print "local_var:", local_var

        local_var = "local"

    func("first")
    func("second")

func1()

出力は次のようになると思います。

最初の local_var: なし
2 番目の local_var: ローカル

ただし、私の実際の出力は次のとおりです。

最初の local_var:
トレースバック (最新の呼び出しが最後):
  ファイル「test.py」の 13 行目
    関数1()
  ファイル「test.py」、10行目、func1
    func("最初")
  ファイル "test.py"、6 行目、func 内
    print "local_var:", local_var
UnboundLocalError: 割り当て前に参照されたローカル変数 'local_var'

Python スコープ ルールに関する私の理解では、これは期待どおりに機能するはずです。これが期待どおりに機能する他のコードがありますが、機能しないコードフラグメントを上記の簡単なケースに減らすことも機能しません。だから私は困惑しています。

4

4 に答える 4

9

local_varinに割り当てると、funcローカルfuncなります。そのため、例外が示すように、printステートメントは、割り当てられる前にその「非常にローカルな」変数を参照します。jtbが言うように、Python 3ではこれをで解決できますが、ステートメントを使用して、Python 2で作業していることはnonlocalコードから明らかです。Python2の従来の解決策は、割り当てが裸の名前ではないことを確認することです。printしたがって、変数を希望よりもローカルにすることはありません。例:

def func1():
    local_var = [None]

    def func(args):
        print args,
        print "local_var:", local_var[0]

        local_var[0] = "local"

    func("first")
    func("second")

func1()

インデックスへの割り当てはベアネームではないため、ローカリティには影響しません。Python2.2以降、ネストされた内部関数が、外部を含む関数のローカルである変数を参照することは完全に許容されます。ベアネームは、変数を参照する場合とは別の問題です)。

于 2009-07-28T17:58:36.537 に答える
1

Pythonのスコープ規則は、この関連する質問で説明されています。

直感的でないUnboundLocalError動作の理由

于 2009-07-28T17:58:16.070 に答える
1

Python 3.0 より前では、関数は外部スコープの非グローバル変数に書き込むことができませんでした。Python3 では、これを機能させるnonlocalキーワードが導入されました。の定義nonlocal local_varの先頭に追加して、期待する出力を取得します。PEP 3104func()を参照してください。

Python 3 で作業していない場合は、変数をグローバルにするか、何らかの方法で関数に渡す必要があります。

于 2009-07-28T17:47:24.187 に答える
1

3.0 より前のこの問題を解決する標準的な方法は次のようになります。

def func1():
    local_var = [None]

    def func(args):
        print args,
        print "local_var:", local_var[0]

        local_var[0] = "local"

    func("first")
    func("second")

func1()
于 2009-07-28T17:56:25.120 に答える