web-dev-qa-db-fra.com

Pourquoi l'objet 'int' n'est-il pas appelable? Une erreur se produit-elle lors de l'utilisation de la fonction sum ()?

J'essaie de comprendre pourquoi je reçois une erreur lorsque j'utilise la fonction sum sur une plage.

Voici le code:

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

Et voici l'erreur:

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

J'ai trouvé cette explication pour l'erreur:

En Python, un "appelable" est généralement une fonction. Le message signifie que vous traitez un nombre (un "" int ") comme s'il s'agissait d'une fonction (un" appelable "), de sorte que Python ne sait pas quoi faire. Il s'arrête.

J'ai également lu que la somme () est susceptible d'être utilisée sur les listes, alors je me demande ce qui ne va pas ici?

Je viens de l'essayer dans un module IDLE et cela a bien fonctionné. Cependant, cela ne fonctionne pas dans l'interpréteur python. Des idées sur comment cela peut être?

7
mattste

Vous avez probablement redéfini votre fonction "somme" pour qu'elle soit un type de données entier. Donc, c'est à juste titre de vous dire qu'un entier n'est pas quelque chose que vous pouvez passer une plage. 

Pour résoudre ce problème, redémarrez votre interprète.

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

Si vous observez la variable sum, vous pouvez obtenir l'erreur que vous voyez.

>>> 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

Notez également que sum fonctionnera correctement avec set. Il n’est pas nécessaire de le convertir en list.

18
John La Rooy

Cela signifie que quelque part dans votre code, vous avez quelque chose comme:

sum = 0

Quelle ombre la somme intégrée (qui est appelable) avec un int (qui ne l'est pas).

16
lvc

Dans l'interprète, il est facile de le redémarrer et de résoudre de tels problèmes. Si vous ne voulez pas redémarrer l'interpréteur, il existe un autre moyen de le réparer:

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

Cela est également pratique si vous attribuez une valeur à une autre fonction intégrée, telle que dict ou list

3
Burhan Khalid