我是编码新手,因此为了练习,我制作了一个函数,从传递给函数的任何字符串中删除所有特定字符。我发现我的 for 循环没有按预期工作。它并没有删除每个“.”。
lst = ['.','.']
for item in lst:
if item == '.':
lst.remove('.')
print(lst)
哪个输出:
['.']
在尝试不同的输入并思考这一点之后,我得出的结论是,for 循环将在循环的每次迭代中检查它是否位于列表的末尾。否则这个循环会产生索引错误。与循环的第一次迭代一样,循环的索引为 0。然后它删除第一个 '.',留下列表 ['.']。现在第二次迭代时索引为 1,但列表只有一个元素。所以循环不在索引范围内。
这是真的吗,还是我错过了什么?
你是对的,只是不是由
for
进行检查。 for
一般适用于所有可迭代对象。它获取一个迭代器并重复调用迭代器的 __next__
方法,直到该方法引发 StopIterator
异常。
我们可以看到没有循环的相同过程
>>> lst= ['.', '.']
>>> i_list = iter(lst)
>>> i_list.__next__()
'.'
>>> lst.remove('.')
>>> i_list.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>