You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用函数触发列表索引不能为字符串TypeError如何解决

问题原因
  1. 直接触发报错的原因是函数调用时传入的参数类型错误:你给evaluateCharges传了列表[250, 185],但函数内部是按照字典类型处理input_data,尝试用字符串键'minutes_used'访问列表元素,列表只支持整数/切片索引,因此抛出TypeError。
  2. 函数本身还存在多处逻辑和语法错误,即使传入正确字典也无法正常运行:
  • 函数内直接引用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:36:00