次の 2 つのループに注目してください。出力は同じですか?
print("#### for 循环 ####")
a = [0] * 6
for i in range(len(a)):
print(i)
a.pop()
print("#### while 循环 ####")
a = [0] * 6
i = 0
while i < len(a):
print(i)
a.pop()
i += 1
出力は次のようになると思われる場合:
#### for 循环 ####
0
1
2
#### while 循环 ####
0
1
2
それは間違っている!実際の出力は次のとおりです。
#### for 循环 ####
0
1
2
3
4
5
#### while 循环 ####
0
1
2
それの訳は:
for
ループのスコープはループの開始前に決定され、ループ本体内の操作の影響を受けません。これは、リストの長さがループ本体内で変更されるかどうかに関係なく、for
ループのスコープは同じままであることを意味します。while
ループのテスト条件は、各ループ反復の開始時に再計算されます。while
したがって、ループを使用して変化するリストを反復処理すると、ループの条件が反復ごとに再チェックされ、条件が満たされなくなったときにループが終了します。
このことから、長さが動的に削減される配列を走査するときに、ループ本体にインデックス操作が含まれている場合、for
そのループを使用すると、 IndexError: list index out of range
!
要約すると、ループを変更可能にしたい場合は、while
ループを使用してください。