Répondre
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» ...! :-)
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
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' –
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.
Bizarre. Son actualisation qu'ils ne permettent plus cela dans Python 3.0 –
- 1. Neat code pour convertir bool [] -> "false, true, true, false"
- 2. Que fait x >>> 0?
- 3. Pourquoi `null> = 0 && null <= 0` mais pas` null == 0`?
- 4. Pourquoi (Si false renvoie "true") ... retourne true?
- 5. Pourquoi -1 >> 1 est -1? Et 1 >> 1 est 0!
- 6. Pourquoi ce programme python s'imprime-t-il? True
- 7. Pourquoi cette syntaxe est-elle invalide? vectorPointer -> [0]
- 8. Que signifie "somevar >> 0"?
- 9. Pourquoi ListBox.Items.IsReadOnly = true? (F #/Silverlight)
- 10. objectAtIndex: 0] numberOfObjects]> fetchLimit
- 11. Transformer 'X' en 1 ou 0, si c'est> 0 ou == 0
- 12. Supprime le 0 final d'une chaîne python
- 13. pourquoi est-ce.offsetLeft 0?
- 14. WIA.DeviceManager.DeviceInfos.Count = 0. Pourquoi?
- 15. this.Loaded + = (s, e) => this.loaded = true ;?
- 16. CurrentDb.RecordsAffected renvoie 0. Pourquoi?
- 17. Pourquoi CreateWindowEx retour 0
- 18. Math.min.apply (0, tableau) - pourquoi?
- 19. Pourquoi Date1.CompareTo (Date2)> 0 est-il plus rapide que Date1> Date2?
- 20. Removelistener de timingSprite.addEventListener (Event.ENTER_FRAME, updateAll, false, 0, true);
- 21. Quel est le résultat de "() => true"
- 22. quelle est l'utilité de '>' en python
- 23. Problème de sélecteur jQuery gt (0)
- 24. Que fait l'opérateur <> en python?
- 25. Maple 13: comment transformer true en 1 et false en 0?
- 26. Pourquoi cette expression renvoie-t-elle true?
- 27. pourquoi pas (list1 [-1] + = list2.pop (0)) + = list2 fonctionne en Python?
- 28. gtkmm - FileChooserDialog - set_show_hidden (true); -> les dossiers sont cachés!
- 29. Pourquoi [] .all? {| A | a.include? ('_')} return true?
- 30. ArrayIndexOutOfBoundsException après Assert (i> = 0)
BTW, Python 3.0 produit un 'TypeError: types non classables: str()> int()' pour la même comparaison – mjv
Relatif http://stackoverflow.com/questions/18387938/how-do-python- comparaison-opérateurs-et-travail-avec-un-nom-fonction-comme-un-opéra – Kasramvd