1

重複の可能性:
外部モジュールによって割り当てられた Python 変数は、印刷にはアクセスできますが、ターゲット モジュールでの割り当てにはアクセスできません。

一般的に、他の言語のスコープ ルールについて考えてみると、以下のコードで変数カウントの問題に遭遇するまで、Python のスコープ ルールはグローバル変数にも似ていると思い込んでいました。

count=1

def intPermute(fix,var):

    if len(var) ==2:
        #import pdb
        #pdb.set_trace()
        print ("%d: %s%c%c" % (count, str(fix),var[0],var[1]))
        count+=1
        print ("%d: %s%c%c" % (count, str(fix),var[1],var[0]))
        count+=1

    else:
        for i in range(len(var)):
            intPermute(fix+var[i],var[:i]+var[i+1:])



def permuteStr(string):
    # permute a string for nPn combinations basically n!
    if string =="" or len(string) <=0:
        return;
    if len(string) <2:
        print "%d: %s" % (count, str(string))

    intPermute("",string)

次のエラーが発生しました: File "/Users/ns/permute2.py", line 9, in intPermute print ("%d: %s%c%c" % (count, str(fix),var[0], var[1])) UnboundLocalError: 代入前にローカル変数 'c​​ount' が参照されました

関数 intPermute の内部スコープ (if ステートメント) 内でグローバル変数 count にアクセスできないように定義された Python スコープ ルールはなぜですか? 関数の最初のステートメント スコープ レベルで同じ変数にアクセスできますか? 何故ですか?関数で同じ名前のローカル変数を定義することにより、グローバルスコープ変数を「オーバーライド」できることは理解していますが、ここではそうではないようです。

この問題を回避するために、intPermute 関数の先頭に次のステートメントを追加することができました: global count

def intPermute(fix,var):

    global count
    if len(var) ==2:
        #import pdb
        #pdb.set_trace()
        print ("%d: %s%c%c" % (count, str(fix),var[0],var[1]))
        count+=1
        print ("%d: %s%c%c" % (count, str(fix),var[1],var[0]))
        count+=1

    else:
        for i in range(len(var)):
            intPermute(fix+var[i],var[:i]+var[i+1:])

さて、グローバルのこの意味は私には明らかではありませんでした.globalキーワードはグローバルスコープでローカル変数を「エクスポート」することだと思いました。

2 つの質問: 1) Python が関数 intPermute の第 2 レベルのスコープでグローバル変数カウントを表示できないのはなぜですか? 関数の最初のレベルのスコープでアクセスできますが? 2) グローバル キーワードがこの問題を解決するのはなぜですか? 1レベルアップのグローバル変数を解決するために常に機能しますか?

ありがとう。

4

1 に答える 1

2

これは「設計による」ものです。http://bugs.python.org/issue9049を参照してください。

于 2012-10-13T03:00:39.923 に答える