2012-05-12 5 views
12

次のコードは悪い習慣ですか?pythonはループの後でループ変数を再利用することを正式にサポートしていますか?

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

どういうわけか、それはforループ内のブロックの範囲に残るべき変数iのように私には感じています。しかし、Python 2.7ではループの後で再利用できます。

pythonは正式にその機能をサポートしていますか、またはその言語を悪用していますか?

+0

なるほど...は思わ[ここ](http://stackoverflow.com/question/2138873/cleanest-way-to-get-last-item-from-python-iterator) – jamylak

+1

次のコードでループ変数の最後の値にアクセスすることから利益を得るかなりの数のユースケースがあります –

答えて

12

はい、それは公式です:これらのことは、単に後に消えることはできません

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

など:fortarget listは単なる変数よりもはるかに多いこと

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

注意ループ。

0

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

+2

Hmm、私はこれを否定しました。「これは機能ではありません」が一番上の答えと直接矛盾しているようですが、今質問を再読します。「私はループスコープだけが続く」という意味ではありません。私はあなたの言葉遣いが不明で、私が最初に持っていた解釈はより自然なもの(そして間違っている)であったと思うので、そこに下垂を残すつもりです。 –

3

Pythonは、CやJavaなどの言語から来ている場合は、スコープには少し特別な感じがすることができます。以前の答えによると、コードは絶対的に有効ですが、私はそれに対して推奨します。それは特に読めるコードを作成せず、さらにsome_valuesが空であると判明した場合、コードの最後の行で例外が発生します。

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

興味深い議論は、hereと、SOのローカルディスカッションを参照してください。

+0

誰がそれをお勧めしますか?なぜコードを読みにくくするのでしょうか?Python変数はその範囲全体に存在しますが、導入されています。 – Marcin

+0

私は同意します。それはちょうど "汚い"と感じます。 – georg

+2

まず、ループが実行され、変数が実際に割り当てられていると仮定します。第二に、これを第三者として読むときは、同じ/低いインデントで定義された変数を仮定します。しかし、これはPythonコミュニティに分かれています。 – petr

1

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

それはbreakユースケースとロジックには適用されないかもしれないが、私はむしろ、このようなものを持っている:

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

しかし、これはまだsome_valuesが空と評価された場合NameErrorを上げるが、明確に聞こえます。内側の範囲の明確な可読性を与えるものではありませんが、字下げはそれを示唆するかもしれません。

しかし、他の人が言っているように、特定の営業担当者の質問に答えるには、はい、合法です。

2

あなたは、いくつかの条件に一致する項目のためのリストをスキャンし、この技術を使用することができます。それが使用されているので、これはOKかもしれないよう

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

handle(item) 
関連する問題