The iterable object for the loop expression is calculated once and remains unchanged despite any index changes caused by the sequence modification. This might lead to unexpected bugs. If you need to modify the sequence, we recommend that you first make a copy, such as by using slice notation.
1def modifying_list_noncompliant():
2 words = ['cat', 'window', 'defenestrate']
3 # Noncompliant: modifies the same list while iterating over it.
4 for word in words:
5 if len(word) > 6:
6 words.insert(0, word)
1def modifying_list_splice_compliant():
2 words = ['cat', 'window', 'defenestrate']
3 # Compliant: creates new list using splicing, hence loops iterate on one
4 # list, modifying a different list.
5 for word in words[:]:
6 if len(word) > 6:
7 words.insert(0, word)