<p>从<a href="http://docs.python.org/2/library/stdtypes.html#comparisons" rel="noreferrer">python 2 manual</a>:</p>
<blockquote>
<p>CPython implementation detail: Objects of different types except numbers are ordered by their type names; objects of the same types that don’t support proper comparison are ordered by their address.</p>
</blockquote>
<p>当您订购两个字符串或两个数字类型时,将按预期的方式进行排序(字符串的字典式排序,整数的数字排序)。</p>
<p>当您订购数值型和非数值型时,数值型优先。</p>
<pre><code>>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
</code></pre>
<p>如果您订购两种不兼容的类型,而这两种类型都不是数字,则它们按其类型名的字母顺序排列:</p>
<pre><code>>>> [1, 2] > 'foo' # 'list' < 'str'
False
>>> (1, 2) > 'foo' # 'tuple' > 'str'
True
>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
</code></pre>
<p>一个例外是旧样式的类总是先于新样式的类。</p>
<pre><code>>>> class Foo: pass # old-style
>>> class Bar(object): pass # new-style
>>> Bar() < Foo()
False
</code></pre>
<hr/>
<blockquote>
<p>Is this behavior mandated by the language spec, or is it up to implementors?</p>
</blockquote>
<p>有<a href="https://stackoverflow.com/questions/1094961/is-there-a-python-language-specification">no language specification</a>。<a href="https://docs.python.org/2/reference/expressions.html#value-comparisons" rel="noreferrer">language reference</a>说:</p>
<blockquote>
<p>Otherwise, objects of different types always compare unequal, and are ordered consistently but arbitrarily. </p>
</blockquote>
<p>所以这是一个实现细节。</p>
<blockquote>
<p>Are there differences between any of the major Python implementations?</p>
</blockquote>
<p>我不能回答这个问题,因为我只使用了正式的CPython实现,但是还有Python的其他实现,比如PyPy。</p>
<blockquote>
<p>Are there differences between versions of the Python language?</p>
</blockquote>
<p>在Python3.x中,行为已被更改,因此尝试对整数和字符串排序将引发错误:</p>
<pre><code>>>> '10' > 5
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'10' > 5
TypeError: unorderable types: str() > int()
</code></pre>