1

Python docs tutorial の Looping Techniques Chapter を読んだところですが、この少年について質問があります:[:]

文字列の開始インデックスと終了インデックスを取ることがわかったので、次のようにします。

text = "This is text"
text[:] # will return the whole text "This is text" and
tex[:4] # will return "This".

しかし、ここでこのコードを見たとき...

words = ['cat', 'dog', 'cowcowcow']
for w in words[:]:  # Loop over a slice copy of the entire list.
    if len(w) > 6:
        words.insert(0, w)
print words

出力:

['cowcowcow', 'cat', 'dog', 'cowcowcow']

[:]... for ループの意味がわかりませんでした。私はただ書くだろう

for w in words:

しかし、そうすると、無限のwhileループになります。なぜですか?

4

5 に答える 5

7

[:]リストの最初から最初までの範囲を意味します-それは本質的にリストをコピーしています(私は一般的list(...)に読みやすさのために代わりに使用することを提唱します。それは同じ仕事をし、シーケンスだけでなくすべてのイテラブルで機能します)。

ここでの問題は、ループ中にリストを変更することです。これは、ループするエントリが増えることを意味するため、無限になります。

一般に、リストを反復しながらリストを変更することは悪い考えです。代わりに、リスト内包表記を使用して新しいリストを作成することを検討してください。

このコードは、長さが 6 を超えるすべての単語をリストの先頭に逆の順序で配置します。したがって、代替の実装は次のようになります。

words = [w for w in reversed(words) if len(w) > 6] + words
于 2013-04-22T17:27:41.353 に答える
4

[:]リストのコピーを作成します。スライスはすべての要素を受け取り、新しいリストを返します。

リスト自体をループして要素を追加し続けると、無限ループになります。ただし、代わりにコピーforをループすると、ループは元のリストが拡張されていることを認識しません。ループに使用されるコピーには、余分な要素が追加されていることがわかりません。

于 2013-04-22T17:27:40.657 に答える
3

これを使用すると、元のリストのコピー[:]が作成されますが、省略すると、コピーではなく同じリストをループしているためです。

リストをループしているときにリストを変更すると、リストに追加し続けるだけで、リストが成長し続けるため、ループが続行されます。

ただし、コピーのループ中にオリジナルを変更すると、コピーの最後に到達して停止します (新しいアイテムが追加されていないため)。

于 2013-04-22T17:28:15.380 に答える
2

Python では、リストを繰り返し処理し、同時にこのリストから要素を削除することはできません。 を繰り返しながら変更できる That waywords[:]のコピーを返します。wordswordswords[:]

于 2013-04-22T17:28:01.980 に答える