
本文详解一个常见但隐蔽的 Python 列表遍历错误:在反转字符串后使用 list.index() 获取位置时,因重复字符导致索引“重置”到首次出现位置,从而破坏逐位比对逻辑。
本文详解一个常见但隐蔽的 python 列表遍历错误:在反转字符串后使用 `list.index()` 获取位置时,因重复字符导致索引“重置”到首次出现位置,从而破坏逐位比对逻辑。
在 Codewars 的字符串后缀判断题中,目标是判断字符串 text 是否以 ending 结尾(如 "samurai" 以 "ai" 结尾 → True)。看似简单的逻辑,却因一个关键误用——list.index(i)——导致在输入 ("sumo", "omo") 时返回错误结果。
问题核心在于以下代码片段:
for i in ending_list:
num = ending_list.index(i) # ⚠️ 危险!重复元素会始终返回首次索引
if ending_list[num] == text_list[num]:
results_list.append(0)
当 ending = "omo" 时,ending_list.reverse() 后变为 ['o', 'm', 'o']。循环中:
- 第一次迭代:i = 'o' → ending_list.index('o') 返回 0(首个 'o' 的位置)→ 比较 text_list[0](即 'o')与 'o' ✅
- 第二次迭代:i = 'm' → index('m') 返回 1 → 比较 text_list[1](即 'm')与 'm' ✅
- 第三次迭代:i = 'o' → ending_list.index('o') 仍返回 0(不是期望的 2!)→ 实际比较 text_list[0] 与 'o',而非 text_list[2] ❌
这导致本应校验末尾三位 'o','m','o' 的逻辑,错误地复用索引 0,完全跳过了真正的第三位,造成误判。
✅ 正确做法是直接使用数值索引遍历,而非依赖 index() 查找:
def solution(text, ending):
text_list = list(text)
ending_list = list(ending)
text_list.reverse()
ending_list.reverse()
if len(text_list) <p>更进一步,Python 原生提供了简洁可靠的替代方案,无需手动反转和索引操作:</p><pre class="brush:php;toolbar:false;">def solution(text, ending):
return text.endswith(ending) # ✅ 推荐:内置方法,高效且语义清晰注意事项:
- list.index(value) 总是返回第一个匹配项的索引,不适用于需按顺序逐位访问的场景;
- 字符串反转 + 逐位比对虽可行,但易出错且效率低;
- 优先使用 str.endswith() —— 它经过高度优化,支持空字符串、Unicode,并自动处理边界条件;
- 若需手动实现(如学习目的),务必用 range(len(...)) 或 enumerate() 获取稳定索引。
掌握索引获取方式的本质差异,是写出健壮循环逻辑的关键一步。











