344

私はPythonを初めて使用するので、これはおそらく単純なスコーピングの質問です。Pythonファイル(モジュール)の次のコードは、私を少し混乱させます。

if __name__ == '__main__':
    x = 1

print x

私が作業した他の言語では、x変数はステートメントに対してローカルであり、ifステートメントの外部に存在してはならないため、このコードは例外をスローします。しかし、このコードは実行され、1を出力します。誰かがこの動作を説明できますか?モジュールで作成されたすべての変数はグローバル/モジュール全体で使用できますか?

4

7 に答える 7

403

Python変数は、それらが割り当てられている最も内側の関数、クラス、またはモジュールにスコープされます。ifやブロックなどの制御ブロックwhileはカウントされないため、内で割り当てられた変数ifは、関数、クラス、またはモジュールにスコープされます。

(ジェネレータ式またはlist / set / dict内包表記によって定義された暗黙の関数は、ラムダ式と同様にカウントされます。これらのいずれにも割り当てステートメントを詰め込むことはできませんが、ラムダパラメーターとfor句のターゲットは暗黙の割り当てです。)

于 2010-05-13T19:21:40.517 に答える
141

はい、それらは同じ「ローカルスコープ」にあり、実際にはこのようなコードはPythonでは一般的です。

if condition:
  x = 'something'
else:
  x = 'something else'

use(x)

xたとえば、CやJavaの場合のように、条件の前に宣言または初期化されないことに注意してください。

つまり、Pythonにはブロックレベルのスコープがありません。ただし、次のような例では注意してください。

if False:
    x = 3
print(x)

これは明らかにNameError例外を引き起こします。

于 2010-05-13T19:10:02.307 に答える
46

Pythonのスコープは次の順序に従います。

  • ローカルスコープを検索する

  • 囲んでいる関数の範囲を検索します

  • グローバルスコープを検索

  • ビルトインを検索

ソース

およびその他のループ/分岐構造はリストされていないことに注意してくださいif。クラス、関数、およびモジュールのみがPythonでスコープを提供するため、ブロックで宣言されたものはifすべて、ブロック外で宣言されたものと同じスコープを持ちます。変数はコンパイル時にチェックされないため、他の言語は例外をスローします。Pythonでは、必要なときに変数が存在する限り、例外はスローされません。

于 2010-05-13T19:13:14.277 に答える
13

Eliが言ったように、Pythonは変数宣言を必要としません。Cでは次のように言います。

int x;
if(something)
    x = 1;
else
    x = 2;

ただし、Pythonでは宣言は暗黙的であるため、xに割り当てると自動的に宣言されます。これは、Pythonが動的に型付けされているためです。静的に型付けされた言語では機能しません。使用するパスによっては、宣言せずに変数を使用する場合があるためです。これは、静的に型付けされた言語ではコンパイル時にキャッチされますが、動的に型付けされた言語では許可されます。

if静的に型付けされた言語がこの問題のためにステートメントの外で変数を宣言しなければならないことに限定されている唯一の理由。ダイナミックを受け入れましょう!

于 2010-05-13T19:14:13.047 に答える
12

Cなどの言語とは異なり、Python変数は、最も内側の「ブロック」だけでなく、関数(またはクラス、モジュール)全体のスコープ内にあります。int xPythonでは変数を宣言する必要がないことを除けば、関数(またはクラス、モジュール)の先頭で宣言したかのようです。

変数の存在は実行時、つまりステートメントxに到達したときにのみチェックされることに注意してください。等しくないprint x場合は、例外が発生します。__name__"__main__"NameError: name 'x' is not defined

于 2010-05-13T19:33:40.583 に答える
4

はい。forスコープにも当てはまります。もちろん機能ではありません。

あなたの例では:ifステートメントの条件がfalseの場合、xは定義されません。

于 2010-05-13T19:10:31.057 に答える
2

このコードはコマンドラインから実行しているため、if条件は真であり、x設定されています。比較:

>>> if False:
    y = 42


>>> y
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    y
NameError: name 'y' is not defined
于 2010-05-13T19:10:56.773 に答える