2010-03-05 4 views
33

En Python 2.6.4:Pourquoi ''> 0 True en Python?

>> ''>0 
True 

Pourquoi?

+21

BTW, Python 3.0 produit un 'TypeError: types non classables: str()> int()' pour la même comparaison – mjv

+0

Relatif http://stackoverflow.com/questions/18387938/how-do-python- comparaison-opérateurs-et-travail-avec-un-nom-fonction-comme-un-opéra – Kasramvd

Répondre

71

La motivation de conception originale pour permettre ORDER-comparaisons d'objets arbitraires était de permettre le tri des listes hétérogènes - utilement, qui placerait toutes les chaînes à côté de l'autre dans l'ordre alphabétique, et tous les nombres l'un à côté de l'autre dans l'ordre numérique, bien que le premier des deux blocs ne soit pas garanti par la langue. Par exemple, cela permettait d'obtenir uniquement des éléments uniques dans n'importe quelle liste (même avec des éléments non-mouillables) en O(N log N) temps le plus défavorable

Au fil des années, cet arrangement pragmatique s'est érodé. La première fissure est survenue lorsque la possibilité de commander - comparer des nombres complexes a été supprimée, il y a quelques versions. Soudain, la possibilité de trier toute liste a disparu: elle ne s'appliquait plus si la liste contenait des nombres complexes, éventuellement associés à des éléments d'autres types. Ensuite, Guido a commencé à ne plus aimer les listes hétérogènes, et a donc commencé à penser que cela n'avait pas vraiment d'importance si ces listes pouvaient être utilement triées ou non ... parce que de telles listes ne devraient pas exister en premier lieu, selon sa nouvelle pensée. . Il n'a rien fait pour les interdire, mais n'était pas enclin à accepter des compromis pour les soutenir non plus.

Notez que les changements se déplacent l'équilibre un peu loin de la « pratique bat la pureté » élément du Zen de Python (qui a été écrit plus tôt, en arrière quand les nombres complexes encore pourraient être comparé ;-) ordre – un peu plus de pureté, un peu moins de praticité. Néanmoins, la possibilité de commander - comparer deux objets arbitraires (tant qu'aucun des deux n'était complexe ;-) resta longtemps, car à peu près à la même époque, Guido commença vraiment à maintenir une forte rétrocompatibilité (un changement qui est tous les deux pratique et pur ;-). Donc, c'est seulement en Python 3, qui a explicitement et délibérément enlevé la contrainte de rétrocompatibilité pour permettre des améliorations longtemps désirées mais incompatibles en arrière (en particulier les simplifications et la suppression de manière obsolète et redondante pour effectuer certaines tâches), La comparaison d'ordres d'instances de types différents est devenue une erreur. Donc, ce traité historique et philosophique est fondamentalement la seule façon de vraiment répondre à votre question «pourquoi» ...! :-)

+1

On devrait peut-être ajouter que même si le langage n'a plus cette fonctionnalité, le tri des listes arbitraires peut facilement être arrêté avec un comparateur personnalisé. Écrivez-le vous-même au cas où vous en auriez besoin - ce serait aussi une approche très pratique. – Trilarion

+0

Note: Dans Python 2, un nombre complexe peut être comparé à n'importe quel autre objet, sauf un autre nombre complexe! 'complex (1,0)> 'abc'' est' False' mais 'complex (1,0)> complex (0,0)' soulève un 'TypeError' –

21

de https://docs.python.org/2.7/tutorial/datastructures.html#id1

Note that comparing objects of different types is legal. The outcome is deterministic but arbitrary: the types are ordered by their name. Thus, a list is always smaller than a string, a string is always smaller than a tuple, etc. [1] Mixed numeric types are compared according to their numeric value, so 0 equals 0.0, etc.

+6

Bizarre. Son actualisation qu'ils ne permettent plus cela dans Python 3.0 –

Questions connexes