Pythonの点滴ノートの:反復器

1120 ワード

1.for/whileループでシーケンスを直接変更しない
一般的には、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になる.