Từ hướng dẫn sử dụng python 2 :
Chi tiết triển khai CPython: Các đối tượng thuộc các loại khác nhau ngoại trừ số được sắp xếp theo tên loại của chúng; các đối tượng cùng loại không hỗ trợ so sánh thích hợp được sắp xếp theo địa chỉ của chúng.
Khi bạn đặt hàng hai chuỗi hoặc hai loại số, việc sắp xếp được thực hiện theo cách mong đợi (thứ tự từ điển cho chuỗi, thứ tự số cho số nguyên).
Khi bạn đặt một loại số và một loại không số, loại số đến trước.
>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
Khi bạn đặt hàng hai loại không tương thích trong đó không phải là số, chúng được sắp xếp theo thứ tự chữ cái của các kiểu chữ của chúng:
>>> [1, 2] > 'foo' # 'list' < 'str'
False
>>> (1, 2) > 'foo' # 'tuple' > 'str'
True
>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
Một ngoại lệ là các lớp kiểu cũ luôn xuất hiện trước các lớp kiểu mới.
>>> class Foo: pass # old-style
>>> class Bar(object): pass # new-style
>>> Bar() < Foo()
False
Là hành vi này được ủy quyền bởi đặc tả ngôn ngữ, hoặc là tùy thuộc vào người thực hiện?
Không có đặc điểm kỹ thuật ngôn ngữ . Tài liệu tham khảo ngôn ngữ nói:
Mặt khác, các đối tượng thuộc các loại khác nhau luôn so sánh không bằng nhau và được sắp xếp một cách nhất quán nhưng tùy ý.
Vì vậy, nó là một chi tiết thực hiện.
Có sự khác biệt giữa bất kỳ triển khai Python chính nào không?
Tôi không thể trả lời câu hỏi này vì tôi chỉ sử dụng triển khai CPython chính thức, nhưng có những triển khai khác của Python như PyPy.
Có sự khác biệt giữa các phiên bản của ngôn ngữ Python?
Trong Python 3.x hành vi đã được thay đổi để cố gắng đặt hàng một số nguyên và một chuỗi sẽ phát sinh lỗi:
>>> '10' > 5
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'10' > 5
TypeError: unorderable types: str() > int()