运行arrayNesting函数出现'NoneType' is not iterable错误,是什么原因?
报错原因分析
- 核心错误为列表
append()方法的误用
Python中列表的append()属于原地修改方法,不会返回修改后的新列表,执行后固定返回None。你在代码中写的new_nums = new_nums.append(nums[k])、seen = seen.append(nums[k])逻辑,会导致第一次循环结束后,new_nums和seen两个变量都被赋值为None。
后续执行if k in seen判断时,需要对seen做迭代操作来检查成员关系,但此时seen是None类型,自然就触发了'NoneType' is not iterable的报错。就算跳过该判断,最后执行len(new_nums)时也会因为new_nums是None抛出类型错误。
额外逻辑问题
就算你删除append前的赋值操作,改成直接执行new_nums.append(nums[k])、seen.append(nums[k])修复报错,代码也不符合arrayNesting的功能要求:
- 目前代码仅从索引0开始遍历,只会统计第一个遇到的环的长度,无法找到所有环中最长的长度
- 外层的
for num in nums循环完全没有用到循环变量num,属于无效的冗余设计
修正后的参考代码
def arrayNesting(nums): max_len = 0 visited = set() # 用集合做成员查询效率远高于列表 for i in range(len(nums)): if i not in visited: current_len = 0 k = i while k not in visited: visited.add(k) current_len += 1 k = nums[k] max_len = max(max_len, current_len) return max_len print(arrayNesting([0,1,2])) # 输出结果为1
内容的提问来源于stack exchange,提问作者Ivanna Kreshchenetska
相关产品推荐
相关产品推荐

