2015-02-01 24 views
5

Risalire un ValueError: cannot convert float NaN to integer ho scoperto che la linea: torneràPerché python max ('a', 5) restituisce il valore stringa?

max('a', 5) 
max(5, 'a') 

a invece di 5.

Nel caso di cui sopra ho usato la corda esempio a ma nel mio caso attuale la stringa è un NaN (il risultato di un processo di adattamento che non è riuscito a convergere).

Qual è la logica alla base di questo comportamento? Perché python non riconosce automaticamente che c'è una stringa lì e che dovrebbe restituire il numero?

Ancora più curioso è che min()fa lavoro come previsto dal:

min('a', 5) 
min(5, 'a') 

rendimenti 5.

+2

Correlato: [Perché None è il più piccolo in python?] (Http: // stackoverflow.it/q/22040724) –

+1

possibile duplicato di [In che modo Python confronta string e int?] (http://stackoverflow.com/questions/3270680/how-does-python-compare-string-and-int) – lightandlight

risposta

11

In Python 2, valori numerici sempre in ordine prima archi e quasi tutti gli altri tipi:

>>> sorted(['a', 5]) 
[5, 'a'] 

numeri poi, sono considerati minore di stringhe. Quando si utilizza max(), significa che la stringa viene selezionata su un numero.

I numeri più piccoli sono una scelta di implementazione arbitraria. Vedere la Comparisons documentation:

Gli operatori <, >, ==, >=, <=, e != confrontare i valori di due oggetti. Gli oggetti non devono avere lo stesso tipo. Se entrambi sono numeri, vengono convertiti in un tipo comune. Altrimenti, gli oggetti di tipi diversi vengono sempre confrontati in modo non uguale e ordinati in modo coerente ma arbitrario.

Bold enfasi miniera.

Python 2 ha tentato molto per rendere ordinabili i tipi eterogenei, il che ha causato molti problemi difficili da eseguire, come i programmatori che tentano di confrontare interi con stringhe e ottenere risultati imprevisti. Python 3 ha corretto questo errore; si otterrà una TypeError invece:

>>> max(5, 'a') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: str() > int() 

ho written elsewhere about the ordering rules, e anche re-implemented the Python 2 rules for Python 3, se si voleva davvero chi è rimasto.

+0

I ' m non è il downvoter, ma è ** non ** vero che "i valori numerici si ordinano sempre prima di altri tipi" - prova ad esempio 'sorted (None, 23))' e vedrai spesso il 'None' prima, anche se non è di tipo numerico. È ** **, o meglio ** era ** una volta che Py2 è storia, una decizione veramente arbitraria –

+0

@AlexMartelli: Nessuna è l'unica eccezione; Tuttavia non volevo esporre il set completo di regole. Collegherò a una risposta in cui ho approfondito. Le scelte erano una volta arbitrarie, anzi, ma dal momento che non sono cambiate da allora, ora sono piuttosto scolpite nella pietra. :-) –

+1

@AlexMartelli: corretta la formulazione povera nella frase di apertura. –

2

In CPython 2.x le stringhe sono sempre maggiori dei numeri, ecco perché si vedono questi comportamenti.

OTOH, non capisco perché pensi che 5 sia "ovviamente" maggiore di "a" ... I valori di diversi tipi sono comparabili solo per comodità (ad es. vogliamo che tutto sia comparabile), e tali confronti definiscono un rigoroso ordinamento debole, ma i confronti inter-type non sono intesi per essere sensibili in alcun modo (come si confronta un numero con una stringa o un oggetto?), solo coerenti.

Problemi correlati