2012-05-17 20 views
12

citato della docs:Python 2.x valori restituiti per cmp

cmp(x, y)

confrontare i due oggetti x e y e restituisce un intero secondo il risultato. Il valore restituito è negativo se x < y, zero se x == y e strettamente positivo se x > y.

ero sotto l'ipotesi che i valori restituiti sono sempre -1, 0, e 1 ma i documenti non dicono esplicitamente che, solo menzionare zero e il valore di ritorno positivo/negativo.

Ci sono situazioni in cui il valore di ritorno di cmp(x,y) non è -1, 0 o 1?

+7

Ovviamente vale la pena notare che l'utilizzo di 'cmp()' è sconsigliato, dato che è andato in Python 3.x. –

risposta

11

No, i documenti dicono esplicitamente che yalues ​​può essere qualsiasi cosa. L'unico valore specificato è 0 se gli oggetti confrontati sono uguali. Non si fidano del fatto che si vedono solo i valori -1, 0 e 1, questo è un dettaglio di implementazione e potrebbe cambiare *, in modo sempre verificare la presenza di < e > 0.

*: nota - in realtà, non lo farà davvero una possibilità di cambiare, dal momento che cmp è andato via in pyhton3. utilizzare invece rich comparison.

2

Solo 0 può essere fatta valere, anche se la docstring per list.sort è interessante:

print list.sort.__doc__ 
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*; 
cmp(x, y) -> -1, 0, 1 

Ma in realtà, specie in realtà non impone questo su di essa la funzione di confronto come si può vedere qui:

def mycmp(a, b): 
    print "mycmp(): a - b = ", a - b 
    return a - b 

L = [50, 30, 20, 40, 70, 50] 

>>> L.sort(cmp=mycmp) 
mycmp(): a - b = -20 
mycmp(): a - b = -10 
mycmp(): a - b = 20 
mycmp(): a - b = 10 
mycmp(): a - b = -10 
mycmp(): a - b = 30 
mycmp(): a - b = 20 
mycmp(): a - b = 10 
mycmp(): a - b = -20 
mycmp(): a - b = 0 

>>> print L 
[20, 30, 40, 50, 50, 70] 

Solo per interesse, ma è chiaro che sort sta lavorando felicemente con valori diversi da -1, 0 o +1, così si dovrebbe essere troppo!

+1

http://docs.python.org/library/functions.html#sorted dice che i compilatori di ordinamento accettano le funzioni di cmp che possono restituire +, 0 o - risultati. –

Problemi correlati