Python列表遍历两种方式差异:for item in list报错求因
问题:两段功能预期一致的代码为何一段报错?
我在类中编写了两个实现相同功能的函数代码片段,原本预期二者行为一致,但第一种方式抛出错误,第二种可正常运行。请解释第一种代码无法运行的原因。
代码1(报错版本)
class Solution: def firstElementKTime(self, a, n, k): # code here countDict = {} for i in a: if (a[i] in countDict): countDict[a[i]] = countDict[a[i]] + 1 else: countDict[a[i]] = 1 for i in a: if countDict[a[i]] == k: return a[i] return -1
抛出的错误信息
Traceback (most recent call last): File "/home/91ded90adaf6c5d579e2dbec3cedff79.py", line 40, in <module> main() File "/home/91ded90adaf6c5d579e2dbec3cedff79.py", line 34, in main print(ob.firstElementKTime(a, n, k)) File "/home/91ded90adaf6c5d579e2dbec3cedff79.py", line 9, in firstElementKTime if (a[i] in countDict): IndexError: list index out of range
代码2(正常运行版本)
class Solution: def firstElementKTime(self, a, n, k): countDict = {} for i in range(0, len(a)): if a[i] in countDict: countDict[a[i]] = countDict[a[i]] + 1 else: countDict[a[i]] = 1 i = i + 1 for i in a: if countDict[a[i]] == k: return a[i] return -1
错误原因解释
代码1的核心问题是混淆了列表遍历中的元素值与索引:
- 在
for i in a:循环中,变量i代表的是列表a中的元素值,而非列表的索引位置。但你错误地用a[i]去访问列表元素,当元素值大于等于列表长度时,就会触发IndexError(比如列表长度为5,元素值为10,a[10]会超出列表的索引范围)。 - 举个直观例子:若
a = [3,1,2],第一次循环i=3,执行a[i]等价于a[3],但该列表只有3个元素(索引范围是0-2),直接触发索引越界报错。
而代码2使用for i in range(0, len(a))循环,这里的i是列表的索引值,因此a[i]能正确获取对应位置的元素,不会出现索引越界问题。
另外补充:代码2中的i = i + 1是多余的,for循环会自动迭代range序列的下一个值,手动加1会导致跳过部分元素,但这不是影响代码运行的核心问题。
内容的提问来源于stack exchange,提问作者bhickta
相关产品推荐
相关产品推荐

