You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:20:19