Python调用函数触发列表索引不能为字符串TypeError如何解决
问题原因
- 直接触发报错的原因是函数调用时传入的参数类型错误:你给
evaluateCharges传了列表[250, 185],但函数内部是按照字典类型处理input_data,尝试用字符串键'minutes_used'访问列表元素,列表只支持整数/切片索引,因此抛出TypeError。 - 函数本身还存在多处逻辑和语法错误,即使传入正确字典也无法正常运行:
- 函数内直接引用了
minutes_included、monthly_plan、vat_tax等全局变量,没有从输入的input_data字典中取值 - 计费逻辑存在覆盖问题:如果通话和短信同时超出套餐,后执行的分支会覆盖前面的
basecharge值,导致只计算一项超量费用 basecharge没有默认初始值,如果通话和短信都没超出套餐,访问basecharge会抛出未定义错误- 输出字符串的引号混用,同时引用了不存在的变量
taxApplied、未定义场景下的aditional_minutes/aditional_texts - 函数默认参数使用了可变对象
[],属于Python常见陷阱,多次调用会出现不可预期的结果
修复方案
1. 修正函数调用逻辑
不要传入列表,直接修改mobile_sub字典中的使用量后,将完整字典作为参数传入函数。
2. 修复函数代码
修改后的完整可运行代码如下:
mobile_sub = {'minutes_used': 200, 'minutes_included': 200, 'texts_used': 200, 'texts_included': 200, 'monthly_plan': 10, 'cost_per_minute': 0.03, 'cost_per_sms': 0.001, 'vat_tax': 0.14} def evaluateCharges(input_data=None): # 处理默认参数 if input_data is None: input_data = mobile_sub # 从输入字典提取所有需要的变量 minutes_used = input_data['minutes_used'] minutes_included = input_data['minutes_included'] texts_used = input_data['texts_used'] texts_included = input_data['texts_included'] monthly_plan = input_data['monthly_plan'] cost_per_minute = input_data['cost_per_minute'] cost_per_sms = input_data['cost_per_sms'] vat_tax = input_data['vat_tax'] # 初始化基础费用为套餐费 计算超量费用 basecharge = monthly_plan aditional_minutes = max(0, minutes_used - minutes_included) aditional_texts = max(0, texts_used - texts_included) basecharge += aditional_minutes * cost_per_minute basecharge += aditional_texts * cost_per_sms # 计算税费 VAT_TAX = basecharge * vat_tax final_charges = round(basecharge + VAT_TAX, 2) # 组装输出字符串 output_string = f"Dear Customer, below are the charges on your account : \n Minutes Used: {minutes_used} \n Texts Used: {texts_used} \n Additional Minutes: {aditional_minutes} \n Additional Texts: {aditional_texts} \n Basecharge: ${round(basecharge,2)} \n Tax Applied: 14% \n Total Charges: ${final_charges}" print(output_string) return final_charges # 调用示例:使用250分钟通话、185条短信 test_sub = mobile_sub.copy() test_sub['minutes_used'] = 250 test_sub['texts_used'] = 185 evaluateCharges(test_sub)
内容的提问来源于stack exchange,提问作者Stephanie Omwanda
相关产品推荐
相关产品推荐

