pythonの変数役割ドメインについて
3639 ワード
ずっとpythonの役割ドメインは難点ではないと思っていましたが、先日別のブログプラットフォームでコードを見て、また私を混乱させました.そこで本を読んで、役割ドメインをもう一度見て、知識の要点と穴をもう一度まとめて、メモを取って、すべてのコードをpython 2に基づいています.7.10基本概念と知識点はあまり言わないで、直接コードに行きます:
このコードは間違っていません.次のセクションを見てください.
foo()にローカル変数barが宣言されているので、最後に印刷されたのは100であることは間違いありませんが、次のコードを見てみると、私を惑わせるコードでもあります.
異常UnboundLocalError:local variable‘bar’referenced before assignmentこれは私を少し迷わせて、これは私の考えと少し異なって、そこで本の上でこのような解釈を見つけました:
グローバル変数と同じ名前のローカル変数を使用する場合は注意してください.ローカル変数の値を与える前に、関数(このグローバル変数にアクセスするために)でこのような名前を使用すると、pythonバージョンに依存する異常(NAMEERRORまたはUnbound-LOcalError)が得られます.
このようなコードも確かに迷っています.グローバル変数とローカル変数が混乱しています.pythonが異常を直接投げ出す行為はいいと思います.直接このようなコードを書かせないでください.しかし、もし本当にこのような状況があったら、globalキーワードを使います.グローバル変数として宣言し、どのように振り回しても構いません.
これではっきりした.globalが関数の上部ではなく、変数を使用または付与した場合、警告が表示されます.
警告が表示されます.
SyntaxWarning: name ‘bar’ is used prior to global declaration global bar
警告も表示されます.
警告は以前とは異なります.
SyntaxWarning: name ‘bar’ is assigned to before global declaration global bar
最後にprint barの結果は100である、すなわちグローバル変数barが100に変更された.fooでは
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に割り当てられている.