重複の可能性:
外部モジュールによって割り当てられた 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: 代入前にローカル変数 'count' が参照されました
関数 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レベルアップのグローバル変数を解決するために常に機能しますか?
ありがとう。