L'extrait suivant est annoté avec la sortie ( comme vu sur ideone.com ):
print "100" < "2" # True
print "5" > "9" # False
print "100" < 2 # False
print 100 < "2" # True
print 5 > "9" # False
print "5" > 9 # True
print [] > float('inf') # True
print () > [] # True
Quelqu'un peut-il expliquer pourquoi le résultat est en tant que tel?
Détails d'implémentation
- Ce comportement est-il imposé par la spécification du langage ou appartient-il aux implémenteurs?
- Existe-t-il des différences entre les principales implémentations de Python?
- Existe-t-il des différences entre les versions du langage Python?
python
types
comparison
python-2.x
lubrifiants polygènes
la source
la source
Réponses:
À partir du manuel de python 2 :
Lorsque vous commandez deux chaînes ou deux types numériques, l'ordre est effectué de la manière attendue (ordre lexicographique pour la chaîne, ordre numérique pour les entiers).
Lorsque vous commandez un type numérique et un type non numérique, le type numérique vient en premier.
>>> 5 < 'foo' True >>> 5 < (1, 2) True >>> 5 < {} True >>> 5 < [1, 2] True
Lorsque vous commandez deux types incompatibles où aucun n'est numérique, ils sont classés par ordre alphabétique de leurs noms de types:
>>> [1, 2] > 'foo' # 'list' < 'str' False >>> (1, 2) > 'foo' # 'tuple' > 'str' True >>> class Foo(object): pass >>> class Bar(object): pass >>> Bar() < Foo() True
Une exception concerne les classes de style ancien qui précèdent toujours les classes de style nouveau.
>>> class Foo: pass # old-style >>> class Bar(object): pass # new-style >>> Bar() < Foo() False
Il n'y a pas de spécification de langue . La référence linguistique dit:
C'est donc un détail de mise en œuvre.
Je ne peux pas répondre à celle-ci car je n'ai utilisé que l'implémentation officielle de CPython, mais il existe d'autres implémentations de Python telles que PyPy.
Dans Python 3.x, le comportement a été modifié de sorte que la tentative de tri d'un entier et d'une chaîne lèvera une erreur:
>>> '10' > 5 Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> '10' > 5 TypeError: unorderable types: str() > int()
la source
complex(1,0) > 'abc'
estFalse
maiscomplex(1,0) > complex(0,0)
soulève unTypeError
Les chaînes sont comparées lexicographiquement et les types différents sont comparés par le nom de leur type (
"int"
<"string"
). 3.x corrige le deuxième point en les rendant non comparables.la source