From 5db1b13c59b82d00d29c2564d10819c2245818c3 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 23 Aug 2019 23:21:03 -0700 Subject: [PATCH 1/2] bpo-32118: Simplify docs for sequence comparison --- Doc/reference/expressions.rst | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 432327a87c3748..4fe6d1ddf15eb3 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1442,25 +1442,9 @@ built-in types. :exc:`TypeError`. Sequences compare lexicographically using comparison of corresponding - elements, whereby reflexivity of the elements is enforced. - - In enforcing reflexivity of elements, the comparison of collections assumes - that for a collection element ``x``, ``x == x`` is always true. Based on - that assumption, element identity is compared first, and element comparison - is performed only for distinct elements. This approach yields the same - result as a strict element comparison would, if the compared elements are - reflexive. For non-reflexive elements, the result is different than for - strict element comparison, and may be surprising: The non-reflexive - not-a-number values for example result in the following comparison behavior - when used in a list:: - - >>> nan = float('NaN') - >>> nan is nan - True - >>> nan == nan - False <-- the defined non-reflexive behavior of NaN - >>> [nan] == [nan] - True <-- list enforces reflexivity and tests identity first + elements. The built-in containers typically assume identical objects are + equal to themselves. That lets them bypass equality tests for identical + objects to improve performance and to maintain their internal invariants. Lexicographical comparison between built-in collections works as follows: From 10ce12c486b6c89f41b6d9cecfb43d436075ad91 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 24 Aug 2019 08:58:25 -0700 Subject: [PATCH 2/2] Address the OP's question about 'None' --- Doc/reference/expressions.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 4fe6d1ddf15eb3..ee13c5f4c6fc23 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -1425,6 +1425,10 @@ built-in types. themselves. For example, if ``x = float('NaN')``, ``3 < x``, ``x < 3``, ``x == x``, ``x != x`` are all false. This behavior is compliant with IEEE 754. +* ``None`` and ``NotImplemented`` are singletons. :PEP:`8` advises that + comparisons for singletons should always be done with ``is`` or ``is not``, + never the equality operators. + * Binary sequences (instances of :class:`bytes` or :class:`bytearray`) can be compared within and across their types. They compare lexicographically using the numeric values of their elements.