9

我试图弄清楚为什么在范围上使用 sum 函数时会出错。

这是代码:

data1 = range(0, 1000, 3)
data2 = range(0, 1000, 5)
data3 = list(set(data1 + data2)) # makes new list without duplicates
total = sum(data3) # calculate sum of data3 list's elements
print total

这是错误:

line 8, in <module> total2 = sum(data3)
TypeError: 'int' object is not callable

我发现了这个错误的解释:

在 Python 中,“可调用”通常是一个函数。该消息意味着您将数字(一个>“int”)视为一个函数(一个“可调用”),因此Python不知道该做什么,所以它>停止。

我还读到 sum() 能够用于列表,所以我想知道这里出了什么问题?

我刚刚在 IDLE 模块中尝试过,效果很好。但是,它在 python 解释器中不起作用。关于如何做到这一点的任何想法?

4

3 回答 3

22

您可能将“sum”函数重新定义为整数数据类型。所以它正确地告诉你整数不是你可以传递范围的东西。

要解决此问题,请重新启动您的解释器。

Python 2.7.3 (default, Apr 20 2012, 22:44:07) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> data1 = range(0, 1000, 3)
>>> data2 = range(0, 1000, 5)
>>> data3 = list(set(data1 + data2)) # makes new list without duplicates
>>> total = sum(data3) # calculate sum of data3 list's elements
>>> print total
233168

如果你sum隐藏内置,你会得到你看到的错误

>>> sum = 0
>>> total = sum(data3) # calculate sum of data3 list's elements
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable

另外,请注意,无需将其转换sumsetlist

于 2012-06-26T06:41:29.473 回答
21

这意味着在你的代码中的其他地方,你有类似的东西:

sum = 0

它用 int (不是)隐藏了内置总和(可调用)。

于 2012-06-26T06:31:09.343 回答
3

在解释器中,它很容易重新启动并修复此类问题。如果您不想重新启动解释器,还有另一种修复方法:

Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> l = [1,2,3]
>>> sum(l)
6
>>> sum = 0 # oops! shadowed a builtin!
>>> sum(l)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> import sys
>>> sum = sys.modules['__builtin__'].sum # -- fixing sum
>>> sum(l)
6

如果您碰巧将值分配给任何其他内置函数,这也会派上用场,例如dictlist

于 2012-06-26T06:52:55.900 回答