Why/how -1j 和 0-1j 会变成不同的字符串吗?

Why/how do -1j and 0-1j become different strings?

-1j0 - 1j 为什么以及如何变成不同的字符串?

>>> a = -1j
>>> b = 0 - 1j
>>> a
(-0-1j)
>>> b
-1j

它们是相同类型的相同值:

>>> a == b
True
>>> type(a), type(b), type(a) is type(b)
(<class 'complex'>, <class 'complex'>, True)

但是strrepr都把它们变成了不同的字符串:

>>> str(a), str(b)
('(-0-1j)', '-1j')
>>> repr(a), repr(b)
('(-0-1j)', '-1j')

为什么以及如何发生?

注意:这是在 Python 3.6.4 中。在 Python 2.7.14 中它们都变成了 '-1j'.

a 的实部是 -0.0,而 b 的实部是 0.0。字符串表示中省略了 0.0

-1j 被视为 -(1j),其中 1j 具有 0.0 的实部。那个真实的部分被否定了。

0 - 1j中,两边的实数分量都为0,减法产生的实数分量为0。

在 Python 2 上,我认为 -1j 可能遇到用于使 -2147483648-9223372036854775808 (platform-dependent) 评估为int 而不是 long。 special-case 处理似乎导致 0.0.

的真实组成部分