
本文讲解如何在 hangman(猜单词)游戏中,将隐藏字符串中所有对应位置的下划线 `_` 替换为用户猜中的字母,重点使用 `enumerate()` 高效定位并批量更新多个匹配索引。
在 Hangman 游戏中,初始显示通常是一串下划线(如 "_____"),代表目标单词的每个字母。当玩家输入一个字母(例如 'p')后,程序需找出该字母在目标单词(如 "hippopotamus")中所有出现的位置,并将对应下划线全部替换为该字母。你原先的代码仅用 str.find() 获取第一个匹配索引,无法处理重复字母(如 'p' 在 "hippopotamus" 中出现 3 次),因此会遗漏后续匹配。
enumerate() 是解决此问题的理想工具——它在遍历字符串时同时提供索引和字符,避免手动维护计数器或多次调用 find()。以下是推荐的实现方式:
randomWord = "hippopotamus"
guess = list("_" * len(randomWord)) # 初始化为可变列表,便于按索引修改
userInput = "p"
# 遍历目标单词:i 是索引,char 是当前字符
for i, char in enumerate(randomWord):
if char == userInput:
guess[i] = userInput # 直接更新对应位置
guess_str = "".join(guess) # 转回字符串用于显示
print(guess_str) # 输出: "__pp_p______"✅ 关键优势:
- enumerate() 一次性获取全部索引,天然支持多匹配场景;
- 将 guess 初始化为 list(而非字符串),因 Python 字符串不可变,逐个赋值必须依赖列表;
- 时间复杂度为 O(n),简洁高效,无额外查找开销。
⚠️ 注意事项:
- 确保 userInput 是单个字母且已转为小写(若 randomWord 为小写),建议统一大小写:userInput.lower();
- 实际游戏中,应在替换后检查是否已完全猜出(if "_" not in guess_str:),并及时结束流程;
- 若需统计错误次数(如 missLett),请仅在 char != userInput 且全词未匹配时才递减,避免重复扣减。
掌握 enumerate() 不仅能优雅解决 Hangman 的核心逻辑,也是 Python 迭代编程的重要基础技能——它让“既要位置又要元素”的需求变得直观而可靠。










