Pythonの点滴ノートの:反復器
1120 ワード
1.for/whileループでシーケンスを直接変更しない
一般的には、1つのシーケンスを反復出力する.しかし、forループでシーケンスを直接変更する場合、私たちは何に注意すべきかという状況があります.
この場合、通常はforループにシーケンスのコピーを提供して動作し、デッドループは発生しません.
発生するすなわちinsertが入ると反復器wは元のインデックスを保持するがwordsの長さは1増加するのでwの値はずっとdefenestrateになる.
一般的には、1つのシーケンスを反復出力する.しかし、forループでシーケンスを直接変更する場合、私たちは何に注意すべきかという状況があります.
この場合、通常はforループにシーケンスのコピーを提供して動作し、デッドループは発生しません.
>>> words = ['cat', 'window', 'defenestrate']
>>> for w in words[:]:
if len(w) > 6:
words.insert(0, w)
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']
コピーwords[:](スライスは新しいオブジェクトを生成する)ではなくwordsを使用すると、最終的にはデッドサイクルが発生する.デッドサイクルが発生する理由は、次のコードからわかります.>>> words = ['cat', 'window', 'defenestrate']
>>> i = 1
>>> for w in words:
if len(w) > 6:
ss = "%s %d" % (w, i)
i += 1
words.insert(0, ss)
if len(words) > 6:
break
>>> words
['defenestrate 4', 'defenestrate 3', 'defenestrate 2', 'defenestrate 1', 'cat', 'window', 'defenestrate']
ここで、死のサイクルは次のとおりです.if len(w) > 6:
発生するすなわちinsertが入ると反復器wは元のインデックスを保持するがwordsの長さは1増加するのでwの値はずっとdefenestrateになる.