None
is always less than any datatype in Python 2 (see object.c
).
In Python 3, this was changed; now doing comparisons on things without a sensible natural ordering results in a TypeError
. From the 3.0 "what's new" updates:
Python 3.0 has simplified the rules for ordering comparisons:
The ordering comparison operators (<
, <=
, >=
, >
) raise a TypeError
exception when the operands don’t have a meaningful natural ordering. Thus, expressions like: 1 < ''
, 0 > None
or len <= len
are no longer valid, and e.g. None < None
raises TypeError
instead of returning False
. A corollary is that sorting a heterogeneous list no longer makes sense – all the elements must be comparable to each other. Note that this does not apply to the ==
and !=
operators: objects of different incomparable types always compare unequal to each other.
This upset some people since it was often handy to do things like sort a list that had some None
values in it, and have the None
values appear clustered together at the beginning or end. There was a thread on the mailing list about this a while back, but the ultimate point is that Python 3 tries to avoid making arbitrary decisions about ordering (which is what happened a lot in Python 2).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…