5

ipythonを実行しているときに状況を見つけました。Python のバージョンは 2.6.6 で、ipython は 0.13 です。例えば:

In [1]: for i in range(100):
   ...:     pass
   ...: 

In [2]: who
Out [2]: i  

In [3]: print i
Out [3]: 99

ループの後、変数iはまだ存在しています。だから私は知りたいのですが、これは Python 設計のバグですか? そうでない場合、なぜですか?ありがとう。

4

1 に答える 1

13

これはバグではありません。

forループは新しいスコープを作成しません。関数とモジュールのみが新しいスコープを導入し、クラス、リスト/辞書/セット内包表記*、ラムダ、およびジェネレーターは、スコープに関して特殊化された関数です。

これは、forループ ステートメントのドキュメントに記載されています。

ループが終了してもターゲット リストは削除されませんが、シーケンスが空の場合は、ループによってまったく割り当てられていません。

この機能の実用的な使い方は、 iterable の最後の項目を取得することです:

last = defaultvalue
for last in my_iter:
    pass

* Python 2 のリスト内包表記はforループのように機能し、新しいスコープはありませんが、Python 3 では、Python バージョン間での dict および set 内包表記と同様に、新しいスコープを作成します。

于 2013-05-25T08:39:31.867 に答える