在for循环中调用remove()出现的问题
在对列表的for循环中,若对列表使用了remove()操作,会出现问题
第一种情况
nums = [1,2,0,4,0]
for value in nums:
print(value)
if value == 0:
nums.remove(value)
print(nums)
# 输出:
1
[1, 2, 0, 4, 0]
2
[1, 2, 0, 4, 0]
0
[1, 2, 4, 0]
0
[1, 2, 4]
遇到第一个0时,下标为2,删除后,列表变为[1, 2, 4, 0];此时下标2的列表元素变为4;
由于for已对下标2的元素访问过了,即第一个0。
便进行下标3的访问,即[1, 2, 4, 0]中的 0 。跳过了对4的访问。
第二种情况
nums = [1,2,0,4,0]
for i in range(len(nums)):
print("Index:",i)
print("Value:",nums[i])
if nums[i] == 0:
nums.remove(nums[i])
print("List:",nums)
print("length:",len(nums))
print()
Index: 0
Value: 1
List: [1, 2, 0, 4, 0]
length: 5
Index: 1
Value: 2
List: [1, 2, 0, 4, 0]
length: 5
Index: 2
Value: 0
List: [1, 2, 4, 0]
length: 4
Index: 3
Value: 0
List: [1, 2, 4]
length: 3
Index: 4
Traceback (most recent call last):
File "<ipython-input-42-7a08cb31bd33>", line 4, in <module>
print("Value:",nums[i])
IndexError: list index out of range
使用索引值进行访问时,会发生数组越界错误。
当删除第一个0时,数组长度减一,下标 2 的列表元素删除,列表变为[1, 2, 4, 0]。
接下来进行下标3的访问,即索引 i 仍旧向前,此时下标3的列表元素为 0 。
略过了原始列表下标3的元素4,索引值 i 的范围仍为[0,4],但列表的长度减少了,便会发生数组越界错误。