Python调用random.choice()次数超列表元素量时停止运行如何解决
Python随机出题游戏运行异常解答
问题原因
首先明确:random.choice()不存在遍历完列表元素就自动停止的机制,每次调用都会随机从传入的序列中返回一个元素,调用次数无限制,你对问题原因的猜测不成立。
实际故障由两处代码逻辑错误导致:
- 题目列表初始化时提前执行了出题逻辑:
math_games_list定义时直接写入了Math_game.division_game(diffculty,1)这类带调用参数的方法,并非存储方法引用,因此列表创建阶段就直接执行了3个出题方法,输出3道题目。 - for循环缩进错误,后续出题逻辑未生效:代码中的for循环和
__init__方法平级,属于类定义阶段的顶层代码,只会在类首次加载时执行,无法访问__init__内部的局部变量math_games_list,也不会按传入的出题数量运行,剩余3道题的生成逻辑完全没有触发。
可行修复方案
核心改动点
- 调整缩进,将出题循环放到
__init__方法内部,保证实例化时按传入参数的数量生成题目 - 列表内存储方法引用而非提前调用,每次随机选中后再执行方法生成新题目
- 使用类实例属性存储正误统计结果,避免全局变量污染
修复后代码
核心类实现
import random # 假设你的Math_game类已提前定义完成 class Math_game_random: def __init__(self,diffculty,amt_problems): self.diffculty = diffculty self.amt_problems = amt_problems # 正误统计改为实例属性 self.correct = 0 self.incorrect = 0 # 列表存储方法引用,不提前调用 math_games_list = [ Math_game.division_game, Math_game.addition_game, Math_game.multiplication_game ] # 循环放到__init__内部,按指定数量出题 for i in range(amt_problems): # 随机选方法后再调用生成新题目 current_game = random.choice(math_games_list) # 假设出题方法返回布尔值标识是否答对,按你实际逻辑调整即可 is_right = current_game(diffculty,1) if is_right: self.correct +=1 else: self.incorrect +=1
调用逻辑
amount_of_problems = 6 game = Math_game_random(1, amount_of_problems) print(f"amount of correct: {game.correct}") print(f"amount of incorrect: {game.incorrect}")
内容的提问来源于stack exchange,提问作者Marcus Peterson
相关产品推荐
相关产品推荐

