9

範囲で合計関数を使用するとエラーが発生する理由を理解しようとしています。

コードは次のとおりです。

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")を関数( "callable")であるかのように扱っていることを意味します。そのため、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

また、に変換する必要がない場合はsum正常に動作することに注意してくださいsetlist

于 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 に答える