3. Comparisons¶
Comparison operations are supported by all objects. They all have the same
priority (which is higher than that of the Boolean operations). Comparisons can
be chained arbitrarily; for example, x < y <= z
is equivalent to x < y and
y <= z
, except that y is evaluated only once (but in both cases z is not
evaluated at all when x < y
is found to be false).
This table summarizes the comparison operations:
Operation | Meaning | Notes |
---|---|---|
< |
strictly less than | |
<= |
less than or equal | |
> |
strictly greater than | |
>= |
greater than or equal | |
== |
equal | |
!= |
not equal | (1) |
is |
object identity | |
is not |
negated object identity |
Notes:
!=
can also be written<>
, but this is an obsolete usage kept for backwards compatibility only. New code should always use!=
.
Objects of different types, except different numeric types and different string
types, never compare equal; such objects are ordered consistently but
arbitrarily (so that sorting a heterogeneous array yields a consistent result).
Furthermore, some types (for example, file objects) support only a degenerate
notion of comparison where any two objects of that type are unequal. Again,
such objects are ordered arbitrarily but consistently. The <
, <=
, >
and >=
operators will raise a TypeError
exception when any operand is
a complex number.
Non-identical instances of a class normally compare as non-equal unless the
class defines the __eq__()
method or the __cmp__()
method.
Instances of a class cannot be ordered with respect to other instances of the
same class, or other types of object, unless the class defines either enough of
the rich comparison methods (__lt__()
, __le__()
, __gt__()
, and
__ge__()
) or the __cmp__()
method.
Two more operations with the same syntactic priority, in
and not in
, are
supported only by sequence types (below).