69 votes

Python Math - TypeError : l'objet 'NoneType' n'est pas subscriptable

Je suis en train de réaliser un petit programme de mathématiques (sans raison particulière, j'en avais juste envie) et je suis tombé sur l'erreur "TypeError : 'NoneType' object is not subscriptable.

Je n'ai jamais vu cette erreur auparavant, donc je n'ai aucune idée de ce qu'elle signifie.

import math

print("The format you should consider:")
print str("value 1a")+str(" + ")+str("value 2")+str(" = ")+str("value 3a ")+str("value 4")+str("\n")

print("Do not include the letters in the input, it automatically adds them")

v1 = input("Value 1: ")
v2 = input("Value 2: ")
v3 = input("Value 3: ")
v4 = input("Value 4: ")

lista = [v1, v3]
lista = list.sort(lista)

a = lista[1] - lista[0]

list = [v2, v4]
list = list.sort(list)

b = list[1] = list[0]

print str(a)+str("a")+str(" = ")+str(b)

L'erreur :

Traceback (most recent call last):
  File "C:/Users/Nathan/Documents/Python/New thing", line 16, in <module>
    a = lista[1] - lista[0]
TypeError: 'NoneType' object is not subscriptable

0 votes

Cela m'a piqué lors de l'accès à un dictionnaire imbriqué something['a']['b']['c'] et seulement en attrapant KeyError sans se rendre compte que le contrat pour une disparition a c'est que a == None Je ne vois pas pourquoi ce serait le contrat...

63voto

DSM Points 71975
lista = list.sort(lista)

Cela devrait être

lista.sort()

El .sort() est in-place, et renvoie None. Si vous voulez quelque chose qui n'est pas in-place, mais qui renvoie une valeur, vous pouvez utiliser

sorted_list = sorted(lista)

Remarque n° 1 : n'appelez pas vos listes. list . Cela supplante le type de liste intégré.

Remarque 2 : je ne suis pas sûr de ce que cette ligne est censée faire :

print str("value 1a")+str(" + ")+str("value 2")+str(" = ")+str("value 3a ")+str("value 4")+str("\n")

est-ce simplement

print "value 1a + value 2 = value 3a value 4"

? En d'autres termes, je ne sais pas pourquoi vous appelez str sur des choses qui sont déjà str.

Aside #3 : parfois vous utilisez print("something") (syntaxe Python 3) et parfois vous utilisez print "something" (Python 2). Cette dernière option vous donnerait une SyntaxError dans py3, donc vous devez utiliser 2.*, auquel cas vous ne voudrez probablement pas en prendre l'habitude ou vous vous retrouverez à imprimer des tuples, avec des parenthèses supplémentaires. J'admets que cela fonctionnera assez bien ici, parce que s'il n'y a qu'un seul élément dans les parenthèses, il n'est pas interprété comme un tuple, mais cela semble étrange à l'œil pythonicien

1 votes

Ah, merci pour la clarification. Aussi, je n'appellerai pas ma liste de listes dans les grands projets. Mais celui-ci est simplement inférieur à 20 lignes et je me sentais peu créatif :P. @#2 Je ne sais pas exactement à quoi je pensais, peut-être que je pensais que Python tenterait d'ajouter "valeur 1a" avec "valeur 2". Mon erreur, j'ai écrit ceci au milieu d'une classe bruyante. @#3 : Oui, j'utilise python 2.7 et merci pour le conseil, j'essaie généralement d'utiliser print ("").

32voto

aculich Points 4563

L'exception TypeError: 'NoneType' object is not subscriptable se produit parce que la valeur de lista est en fait None . Vous pouvez reproduire TypeError que vous obtenez dans votre code si vous essayez ceci à la ligne de commande Python :

None[0]

La raison pour laquelle lista prend la valeur None parce que la valeur de retour de la fonction list.sort() es None ... il le fait no retourne une copie triée de la liste originale. Au lieu de cela, comme le La documentation souligne la liste est triée en place au lieu de faire une copie (pour des raisons d'efficacité).

Si vous ne voulez pas modifier la version originale vous pouvez utiliser

other_list = sorted(lista)

0voto

Antonio Peixoto Points 26

Sur ce lien https://docs.python.org/2/tutorial/datastructures.html vous pouvez lire cette méthode "Trier les éléments de la liste en place", ce qui signifie que la valeur du résultat sera triée et que le résultat sera sur lui-même. le résultat sera sur lui-même. La fonction retourne None.

Lorsque vous affectez le résultat à "lista" à la ligne 14

lista = list.sort(lista)

vous zone en le réglant sur Aucun. C'est là que réside l'erreur. None n'a toujours pas de données et ne peut pas être subscriptable. "Erreur de type : l'objet 'NoneType' n'est pas inscriptible.

pour corriger cette erreur (pour trier la liste) faites ceci à la ligne 14 :

lista.sort() # this will sort the list in line

Mais il y a d'autres erreurs : à la ligne 18, quand vous assignez :

list = [v2, v4]

Si vous bloquez ce type "liste" intégré, vous obtiendrez l'erreur suivante :

TypeError: 'list' object is not callable

Pour corriger ceci, faire cela, dire :

lista2 = [v2, v4]

A nouveau à la ligne 19 la même erreur que la ligne 14. Faites ceci pour trier l'autre liste :

lista2.sort()

À la ligne 21, vous essayez d'indexer la liste de types intégrée. Pour corriger, faites ceci :

b = lista2[1] = lista2[0]

Avec cela, votre code fonctionnera bien. Enfin le code complet et correct :

import math

print("The format you should consider:")
print str("value 1a")+str(" + ")+str("value 2")+str(" = ")+str("value 3a ")+str("value 4")+str("\n")

print("Do not include the letters in the input, it automatically adds them")

v1 = input("Value 1: ")
v2 = input("Value 2: ")
v3 = input("Value 3: ")
v4 = input("Value 4: ")

lista = [v1, v3]
lista.sort()

a = lista[1] - lista[0]

lista2 = [v2, v4]
lista2.sort()

b = lista2[1] = lista2[0]

print str(a)+str("a")+str(" = ")+str(b)

0voto

ashwinjoseph Points 189

Comme indiqué précédemment dans l'une des réponses, cette erreur se produit lorsque la valeur de la liste s'avère être vide. Bien que ce ne soit pas tout à fait pertinent pour cette question, la même erreur s'est produite pour moi lors de la lecture d'images en utilisant opencv et numpy parce que le nom du fichier s'est avéré être différent de celui spécifié probablement ou parce que le répertoire de travail n'a pas été spécifié correctement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X