Python实现3位猜数字游戏报list[...]TypeError错误求解
错误产生原因
你遇到的TypeError: There are no type variables left in list[...]报错直接触发原因是列表创建语法写错了:
Python中list[...](方括号)是类型注解场景下用的泛型写法,不是用来创建列表实例的语法;创建列表要么直接用字面量写法[元素1,元素2],要么调用内置构造函数list(可迭代对象)(这里必须用圆括号)。你写的numbertoguess = list[x, y, z] 会被解释器识别为类型标注操作,自然抛出类型错误。
除了这个直接触发报错的语法问题,你的代码还有多处逻辑错误,就算改了这行也无法正常运行:
- 随机数生成逻辑有问题:单独生成3个1-9的随机数可能出现重复数位,不符合常规猜数字(棒球游戏)的规则
- 输入类型不匹配:
input()返回的是字符串,直接转列表得到的是字符型元素(比如输入123会得到['1','2','3']),和整数型的答案比较永远不会相等 - 计数逻辑错误:现有逐位判断没有排除strike的情况,会把位置正确的数字重复计入ball计数;且打印时直接用
+拼接整数和字符串,会触发新的类型错误 - 循环逻辑错误:用户输入只在循环外读取一次,猜错后不会重新获取输入,会陷入死循环
- 缺少输入合法性校验:没有处理用户输入长度不对、输入非数字、输入重复数字等异常场景
修复方案
修复所有问题后的可运行代码如下:
import random # 生成3位1-9之间、无重复的答案数字 numbertoguess = random.sample(range(1, 10), 3) while True: user_input = input('What number do you want to guess?') # 校验输入格式 if len(user_input) != 3 or not user_input.isdigit(): print("Invalid input, please enter 3 digits") continue userguess = [int(c) for c in user_input] if len(set(userguess)) != 3 or any(num < 1 or num > 9 for num in userguess): print("Invalid input, please enter 3 unique digits from 1 to 9") continue strike = 0 ball = 0 # 统计位置、数字都正确的strike数量 for i in range(3): if userguess[i] == numbertoguess[i]: strike += 1 # 统计所有数字命中的总数,减去strike就是数字对、位置错的ball数量 total_correct_num = len(set(userguess) & set(numbertoguess)) ball = total_correct_num - strike print(f"{strike}S {ball}B") if strike == 3: print('you win!') break
内容的提问来源于stack exchange,提问作者RPepero
相关产品推荐
相关产品推荐

