CodingBat课堂作业:Python same_first_last函数报错调试求助
解决你的CodingBat数组问题:索引越界与语法错误
让我们一步步拆解你遇到的问题,帮你搞定这个作业:
先看你代码里的核心问题
第一个版本的问题
你的初始代码:
def same_first_last(nums): if (nums[0] == nums[(len(nums))-1]==6): return True else: return False
这里有两个关键问题:
- 错误的条件逻辑:
nums[0] == nums[(len(nums))-1]==6是把三个判断连在一起,相当于要求第一个元素等于最后一个,且最后一个元素等于6——这完全偏离了题目“首尾元素相等即可”的要求。 - 缺少数组长度校验:如果传入空数组
[],访问nums[0]会直接触发list index out of range错误,因为空数组没有可索引的元素。
第二个版本的问题
第二个版本的代码:
def same_first_last(nums): if (nums[0] == (nums[nums.length]) - 1): return True else: return False
这里的问题更偏向Python语法误解:
- 混淆了Python与其他语言的长度获取方式:Python列表没有
.length属性(这是Java/JavaScript的写法),正确获取长度的方式是len(nums),所以nums.length会直接抛出'list' object has no attribute 'length'错误。 - 索引计算完全错误:就算改成
len(nums),nums[len(nums)]本身就是越界的(列表索引从0开始,最后一个元素的索引是len(nums)-1),你还额外加了-1,完全偏离了“比较首尾元素”的目标。
正确的解决方案
按照题目要求,我们需要同时满足两个条件:
- 数组长度大于等于1(避免空数组索引越界)
- 第一个元素和最后一个元素相等
这里提供两种写法,功能完全一致:
简洁版(推荐)
def same_first_last(nums): return len(nums) >= 1 and nums[0] == nums[-1]
清晰的if-else版
def same_first_last(nums): if len(nums) >= 1 and nums[0] == nums[-1]: return True else: return False
代码细节解释
len(nums) >= 1:这一步必须放在前面,先确保数组非空,后续访问索引才不会报错。nums[-1]:Python支持负索引,-1直接指代列表的最后一个元素,比nums[len(nums)-1]更简洁,效果完全相同。and逻辑运算符:只有当两个条件都满足时,才会返回True,否则返回False,完美匹配题目要求。
测试示例验证
代入题目给出的示例,结果完全符合预期:
same_first_last([1, 2, 3])→ 长度≥1,但1≠3 → 返回False ✔️same_first_last([1, 2, 3, 1])→ 长度≥1,且1=1 → 返回True ✔️same_first_last([1, 2, 1])→ 长度≥1,且1=1 → 返回True ✔️- 空数组
same_first_last([])→ 长度<1 → 返回False(不会触发索引错误)
内容的提问来源于stack exchange,提问作者Nerdy General
相关产品推荐
相关产品推荐

