Python特定整数输入验证问题:输入0返回True而非0的解决需求
问题
我有一个列表list = ["Dog", "Cat"],将其枚举输出为:
0 Dog 1 Cat
希望通过input()让用户选择其中一项,验证输入必须是0、1(未来会扩展到0至20)。验证逻辑是先确保输入是整数,再检查该整数是否在预先生成的有效序号列表list_with_valid_numbers_to_choose_from(如[0,1])中。目前所有情况都正常,唯独输入0时返回的是True而非预期的0,相关代码如下:
def get_number(no_elements, list_with_valid_numbers_to_choose_from): while True: print(f"no_elements= {no_elements}") # 此函数中未实际使用no_elements value = input("Enter the number of the animal you want to choose: ") try: if value := int(value) or value == "0": # 转换为整数成功 # 检查整数是否为有效选项 for element in list_with_valid_numbers_to_choose_from: # 例如从["Dog", "Cat"]生成的[0,1] if element == value: print(f"value= {value}") if value == 0: del(value) value=0 return 0 return value raise ValueError("There are no animals (check to see if you created one earlier), OR, you didn't enter a valid number according to the choices given") except ValueError as e: print(e)
想知道怎么修改才能返回正确的变量值?
问题原因
问题出在if value := int(value) or value == "0"这一行的逻辑错误:
- 当输入"0"时,
int(value)得到整数0,在Python中0属于布尔假值,所以会执行value == "0"的判断,这个判断结果是True,最终value被赋值为布尔值True - 后续循环检查
element == value时,因为Python中1 == True会返回True,所以代码会错误地匹配到有效列表中的1,最终返回True而非预期的0
修正后的代码
重构验证逻辑,简化流程同时避免错误:
def get_number(no_elements, list_with_valid_numbers_to_choose_from): while True: print(f"no_elements= {no_elements}") value_input = input("Enter the number of the animal you want to choose: ") try: # 先将输入转换为整数 value = int(value_input) # 直接检查整数是否在有效序号列表内 if value in list_with_valid_numbers_to_choose_from: return value # 不在有效范围则抛出错误 raise ValueError(f"Please enter a number from: {list_with_valid_numbers_to_choose_from}") except ValueError: # 统一处理非整数输入和无效序号的情况 print(f"Error: Invalid input. Please enter a valid integer from the available options.")
修改说明
- 移除了错误的布尔赋值表达式,改为先明确转换输入为整数,避免将布尔值赋值给
value - 用
value in list_with_valid_numbers_to_choose_from替代循环遍历,代码更简洁高效 - 拆分错误提示逻辑,让用户更清楚问题所在
- 无需单独处理0的特殊情况,只要0在有效列表中,就会正常返回
内容的提问来源于stack exchange,提问作者Micklos
相关产品推荐
相关产品推荐

