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

Python报错'str' object is not callable:likes函数问题排查

问题分析与修复

让我们一步步拆解你代码里的问题:

1. 字符串被当作函数调用(触发'str' object is not callable的核心原因)

你的字典里,键0对应的是直接的字符串值:"no one likes this",但其他键对应的是lambda函数。当len(names) == 0时,你的return语句会执行:

dictionary_of_sizes[0](names)

这相当于把字符串当作函数去调用,自然会抛出'str' object is not callable错误。

2. 变量名拼写错误

在键3对应的lambda里,你写了name[0](少了末尾的s),正确应该是names[0],否则会触发NameError: name 'name' is not defined。

3. return语句的逻辑漏洞

当len(names) >=4时,你直接返回了dictionary_of_sizes[4]这个lambda函数对象,而没有调用它并传入names参数,这会导致返回的是函数本身而不是预期的字符串。


修复后的代码

我们可以把字典里所有值都统一为lambda函数(包括键0的情况),同时修正拼写错误和return逻辑:

def likes(names):
    dictionary_of_sizes = {
        0: lambda names: "no one likes this",
        1: lambda names: "{} likes this".format(names[0]),
        2: lambda names: "{} and {} like this".format(names[0], names[1]),
        3: lambda names: "{}, {} and {} like this".format(names[0], names[1], names[2]),
        4: lambda names: "{}, {} and {} others like this".format(names[0], names[1], len(names)-2)
    }
    # 根据长度选择对应的函数,长度>=4时用键4的函数
    size_key = min(len(names), 4)
    return dictionary_of_sizes[size_key](names)

为什么这样改?

  • 所有字典值都是lambda函数,保证了无论长度是多少,我们都是调用函数来获取结果,避免了字符串被当作函数调用的问题。
  • 用min(len(names), 4)来统一处理长度>=4的情况,不需要单独写else分支,逻辑更简洁。
  • 修正了name[0]的拼写错误,改为names[0]。

测试几个案例验证:

print(likes([]))  # 输出: no one likes this
print(likes(["Alice"]))  # 输出: Alice likes this
print(likes(["Alice", "Bob"]))  # 输出: Alice and Bob like this
print(likes(["Alice", "Bob", "Charlie"]))  # 输出: Alice, Bob and Charlie like this
print(likes(["Alice", "Bob", "Charlie", "David"]))  # 输出: Alice, Bob and 2 others like this

内容的提问来源于stack exchange,提问作者Vinícius Oliveira Barros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:38:42