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

Python运行Hangman游戏报NameError,函数内定义的变量提示未定义怎么办

问题根因

你遇到的变量未定义报错是缩进错误+函数未调用两个问题共同导致的:

  • 你把while len(word_letters) > 0: 以及后续的所有游戏循环逻辑都写在了hangman函数外部,函数内部定义的变量属于局部作用域,函数外无法直接访问,所以直接触发未定义报错。
  • 你定义完hangman函数后完全没有调用它的代码,就算缩进修正正确,游戏逻辑也不会运行。

你问是否需要将变量设置为全局变量,答案是不需要。函数内部的局部变量只要在函数作用域内访问就完全正常,设置全局变量反而会增加代码维护难度,容易出现变量被意外修改的问题。

其他需要修正的代码错误
  • get_valid_word函数的循环条件写错:你写的是while '-' in words or ' ' in word,第一个判断误检查词汇列表本身有没有横杠,应该改成'-' in word才是判断选中的单词里有没有无效字符。
  • 你在while循环里重复给word、word_letters、alphabet、used_letters赋值,每次循环都会重置所有游戏状态,游戏根本无法正常推进,这些初始化逻辑应该放在循环外面、hangman函数的开头。
  • 代码末尾多余的user_input = input('Type something:')是无用测试代码,可以直接删除。
修正后的完整代码
import random
from words import words 
import string

def get_valid_word(words):
    word = random.choice(words)     # 从词汇列表随机选一个单词
    while '-' in word or ' ' in word: # 修正:判断选中的单词是否有横杠或空格
        word = random.choice(words)
    return word.upper() # 统一转大写避免大小写判断冲突

def hangman():
    word = get_valid_word(words)
    word_letters = set(word)
    alphabet = set(string.ascii_uppercase)
    used_letters = set()        # 记录用户已经猜过的字母

    # 游戏主循环 所有逻辑缩进在hangman函数内部
    while len(word_letters) > 0:
        # 打印已使用的字母
        print('你已经猜过的字母: ', ' '.join(used_letters))

        # 打印当前单词的显示状态(猜对的显示字母,没猜对的显示-)
        word_list = [letter if letter in used_letters else '-' for letter in word]
        print('当前单词: ', ' '.join(word_list))

        user_letter = input('猜一个字母: ').upper()
        if user_letter in alphabet - used_letters:
            used_letters.add(user_letter)
            if user_letter in word_letters:
                word_letters.remove(user_letter)

        elif user_letter in used_letters:
            print('你已经猜过这个字母了,请重新输入。')

        else:
            print('你输入的不是有效字符,请重新输入。')
    
    # 循环结束说明所有字母都猜对了
    print(f'恭喜你猜对了!单词是:{word}')

# 调用函数启动游戏
hangman()

内容的提问来源于stack exchange,提问作者user10440380

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:42:03