pythonの変数役割ドメインについて

3639 ワード

ずっとpythonの役割ドメインは難点ではないと思っていましたが、先日別のブログプラットフォームでコードを見て、また私を混乱させました.そこで本を読んで、役割ドメインをもう一度見て、知識の要点と穴をもう一度まとめて、メモを取って、すべてのコードをpython 2に基づいています.7.10基本概念と知識点はあまり言わないで、直接コードに行きます:
bar = 200
def foo():
    print bar
foo()  # 200

このコードは間違っていません.次のセクションを見てください.
bar = 200
def foo():
    bar = 100
    print bar
foo()  # 100

foo()にローカル変数barが宣言されているので、最後に印刷されたのは100であることは間違いありませんが、次のコードを見てみると、私を惑わせるコードでもあります.
bar = 200
def foo():
    print bar
    bar = 100 
foo()  #     

異常UnboundLocalError:local variable‘bar’referenced before assignmentこれは私を少し迷わせて、これは私の考えと少し異なって、そこで本の上でこのような解釈を見つけました:
グローバル変数と同じ名前のローカル変数を使用する場合は注意してください.ローカル変数の値を与える前に、関数(このグローバル変数にアクセスするために)でこのような名前を使用すると、pythonバージョンに依存する異常(NAMEERRORまたはUnbound-LOcalError)が得られます.
このようなコードも確かに迷っています.グローバル変数とローカル変数が混乱しています.pythonが異常を直接投げ出す行為はいいと思います.直接このようなコードを書かせないでください.しかし、もし本当にこのような状況があったら、globalキーワードを使います.グローバル変数として宣言し、どのように振り回しても構いません.
bar = 200
def foo():
    global bar
    print bar
    bar = 100
print bar  # 200
foo()  # 200
print bar  # 100

これではっきりした.globalが関数の上部ではなく、変数を使用または付与した場合、警告が表示されます.
bar = 200
def foo():
    print bar
    global bar
    bar = 100
foo()  # 200  

警告が表示されます.
SyntaxWarning: name ‘bar’ is used prior to global declaration global bar
警告も表示されます.
bar = 200
def foo():
    print bar
    bar = 100
    global bar
foo()  # 200 
print bar  # 100

警告は以前とは異なります.
SyntaxWarning: name ‘bar’ is assigned to before global declaration global bar
最後にprint barの結果は100である、すなわちグローバル変数barが100に変更された.fooではbar = 100が先にあるからglobal barがあるがbarは依然としてグローバル変数として100に割り当てられている.