Python实现hangman游戏时list.append代码运行报错如何解决?
错误产生原因
Python 中列表的append()方法属于原地操作,执行后只会返回None,不会返回修改后的列表对象。
你代码中words = words.append(line.rstrip())的写法会在第一次循环执行后,把原本的列表变量words覆盖为None,第二次循环尝试调用None.append()时就会触发你遇到的属性错误。
基础修复方案
只需要删除append前的赋值操作即可,同时建议用with语句管理文件打开,避免资源泄漏:
import random def wordsChoose(mode, words): mode = str(mode)+'.txt' with open(mode, 'r', encoding='utf-8') as f: for line in f: words.append(line.rstrip()) theword = random.choice(words) return theword words = [] result = wordsChoose('fruits', words)
更优实现方案
可以简化参数传递、增加异常处理,逻辑更健壮:
import random def get_random_word(mode: str) -> str: file_path = f"{mode}.txt" words = [] try: with open(file_path, 'r', encoding='utf-8') as f: # 直接用生成式加载所有非空行,自动去重 words = list({line.strip() for line in f if line.strip()}) except FileNotFoundError: raise ValueError(f"对应词库文件{file_path}不存在,请检查模式参数是否正确") if not words: raise ValueError(f"词库文件{file_path}中没有有效单词") return random.choice(words) # 调用示例 target_word = get_random_word('fruits')
优化点说明:
- 函数内部自行维护词库列表,不需要外部传入空列表做参数,减少冗余逻辑
- 自动过滤空行,还做了去重处理,避免同一个单词重复加载
- 增加了文件不存在、词库为空的异常提示,方便排查问题
- 用f-string拼接路径,代码可读性更高
- 明确了参数和返回值的类型,后续维护更方便
内容的提问来源于stack exchange,提问作者Dominik Grześkowiak
相关产品推荐
相关产品推荐

