回答:
Python変数のスコープは、それらが割り当てられている最も内側の関数、クラス、またはモジュールです。のような制御ブロックif
およびwhile
はカウントされないため、内部で割り当てられた変数if
は、引き続き関数、クラス、またはモジュールにスコープされます。
(ラムダ式と同様に、ジェネレータ式またはlist / set / dict内包によって定義された暗黙的な関数はカウントします。割り当てステートメントをこれらのいずれかに詰め込むことはできませんが、ラムダパラメーターとfor
句のターゲットは暗黙的な割り当てです。)
はい、それらは同じ「ローカルスコープ」にあり、実際には次のようなコードがPythonで一般的です。
if condition:
x = 'something'
else:
x = 'something else'
use(x)
x
たとえば、CやJavaのように、条件の前で宣言または初期化されないことに注意してください。
つまり、Pythonにはブロックレベルのスコープがありません。ただし、次のような例には注意してください。
if False:
x = 3
print(x)
明らかにNameError
例外が発生します。
Eliが言ったように、Pythonは変数宣言を必要としません。Cでは次のようになります。
int x;
if(something)
x = 1;
else
x = 2;
しかし、Pythonでは宣言は暗黙的であるため、xに割り当てると自動的に宣言されます。これは、Pythonが動的に型付けされているためです。静的に型付けされた言語では機能しません。使用されるパスによっては、変数が宣言されずに使用される可能性があるためです。これはコンパイル時に静的に型付けされた言語でキャッチされますが、動的に型付けされた言語では許可されます。
静的型付け言語がif
この問題のために文の外で変数を宣言する必要があることに限定されている唯一の理由。ダイナミックを受け入れる!
Cなどの言語とは異なり、Python変数は、最も内側の「ブロック」だけでなく、関数(またはクラス、モジュール)全体のスコープ内にあります。あなたが宣言したかのようですint x
関数(またはクラス、モジュール)の先頭でしたかのようですが、Pythonでは変数を宣言する必要がない点が異なります。
変数の存在はx
実行時、つまりprint x
ステートメントに到達したときにのみチェックされることに注意してください。__name__
等しくない場合は"__main__"
、例外が発生しますNameError: name 'x' is not defined
。
はい。それはまた真実ですfor
スコープ。もちろん機能しません。
あなたの例では:if
ステートメントの条件がfalseの場合、x
定義されません。
if
上記の文は(すなわち、真の保持していない__name__
ではない'__main__'
あなたの代わりにトップレベルにそれを実行するのでモジュールをインポートする場合など)、そしてx
拘束されず、それ以降されているんprint x
声明をスローしNameError: name 'x' is not defined
ます。