20

次のコードは悪い習慣ですか?

for i in some_values:
    do_whatever(i)
do_more_things(i)

iどういうわけか、変数はforループ内のブロックのスコープ内にとどまる必要があるように感じます。ただし、python 2.7では、ループ後に再利用できます。

Pythonはその機能を公式にサポートしていますか、それとも私は言語を悪用していますか?

4

5 に答える 5

17

はい、それは公式です:

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

> The target list is not deleted when the loop is finished 

http://docs.python.org/reference/compound_stmts.html#for

後のターゲットリストforは単なる変数ではないことに注意してください。

for some_list[blah] in...
for some_object.foo in...
for a[:n] in ...:

など。これらのものは、ループの後で単純に消えることはできません。

于 2012-05-12T12:27:09.817 に答える
6

CやJavaなどの言語を使用している場合、Pythonはスコーピングに関して少し特別な感じがすることがあります。前の答えが言うように、コードは絶対に有効ですが、私はそれに反対することをお勧めします。特に読みにくいコードが作成され、さらに、some_values空であることが判明した場合は、コードの最後の行で例外が発生します。

したがって、あなたの質問に対する答えは-はい、それは公式にサポートされていますが、ほとんどの場合、それは推奨される戦略ではありません。

興味深い議論はここで見つけることができ、 SOに関するローカルの議論もあります。

于 2012-05-12T12:26:06.800 に答える
5

この手法を使用して、いくつかの基準に一致するアイテムのリストをスキャンできます。

for item in iter:
    if interesting(item):
        break
else:
    raise ValueError('iter is boring.')

handle(item)
于 2012-05-12T15:55:37.897 に答える
1

@petrが言ったように、それは不自然に聞こえます。それが自然であることが許されているからではなく、あなたがそれを使わなければならないからでもありません。

ユースケースのあるロジックには当てはまらないかもしれませんが、私はむしろこのようなものを持っていますbreak

for i in some_values:
    do_whatever(i)
else:
    do_more_things(i)

しかし、これは空であると評価されたNameError場合でも上昇しますが、より明確に聞こえます。some_values内部スコープの明確な読みやすさは得られませんが、インデントがそれを示唆している可能性があります。

しかし、他の人が言ったように、特定のOPの質問に答えるために、はい、それは合法です。

于 2012-05-12T14:02:25.250 に答える
-1

それは機能ではありません。あなたが書いたように、変数はスコープに残ります。これは通常のインタプリタの動作です。

于 2012-05-12T12:15:22.097 に答える