2012-02-16 20 views
12

Sto facendo un piccolo programma per la matematica (nessun motivo particolare, volevo solo tipo di voluto) e mi sono imbattuto nell'errore "TypeError: 'NoneType' l'oggetto non è . subscriptableMath Python - TypeError: l'oggetto 'NoneType' non è pedice

non ho mai visto prima questo errore, quindi non ho idea di cosa significhi

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'errore:.

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 

risposta

21
lista = list.sort(lista) 

Questo dovrebbe essere

lista.sort() 

Il metodo .sort() è sul posto, e restituisce None. Se si desidera qualcosa non sul posto, che restituisce un valore, è possibile utilizzare

sorted_list = sorted(lista) 

parte 1 #: si prega di non chiamare le vostre liste list. Ciò elimina il tipo di lista integrata.

parte # 2: Non sono sicuro di ciò che questa linea è destinata a fare:

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

è semplicemente

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

? In altre parole, non so perché stai chiamando str sulle cose che sono già str.

A parte # 3: a volte si utilizza print("something") (sintassi Python 3) e talvolta si utilizza print "something" (Python 2). Quest'ultimo ti darà un SyntaxError in py3, quindi devi essere in esecuzione 2. *, nel qual caso probabilmente non vuoi prendere l'abitudine o finirai per stampare tuple, con parentesi extra. Ammetto che funzionerà abbastanza bene qui, perché se c'è un solo elemento tra parentesi non è interpretato come una tupla, ma sembra strano a occhio divinatorio ..

+0

Ah, grazie per il chiarimento. Inoltre, non chiamerò la mia lista di liste in grandi progetti. Ma questo è semplicemente sotto le 20 righe e io mi sentivo non creativo: P. @ # 2 Non esattamente quello che stavo pensando, forse pensavo che Python avrebbe tentato di aggiungere "value 1a" con "value 2". Il mio errore, l'ho scritto nel bel mezzo di un'aula rumorosa. @ # 3: Sì, sto usando python 2.7 e grazie per il consiglio, generalmente tento di usare print (""). –

12

L'eccezione TypeError: 'NoneType' object is not subscriptable accade perché il valore di lista è in realtà None. È possibile riprodurre TypeError che si ottiene nel codice, se si tenta questo nella riga di comando Python:

None[0] 

La ragione per cui lista viene impostata su Nessuno è perché il valore di ritorno di list.sort() è None ... lo fa non restituisce una copia ordinata della lista originale. Invece, come documentation points out, l'elenco viene ordinato sul posto invece di una copia in corso (questo è per motivi di efficienza).

Se non si desidera modificare la versione originale è possibile utilizzare

other_list = sorted(lista)