为什么/如何-1j和0-1j成为不同的字符串?

时间:2018-03-08 17:32:57

标签: python python-3.x python-internals

为什么以及-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'

1 个答案:

答案 0 :(得分:3)

declare @t1 table (id int, rowId int, value int); insert into @t1 values (2447234, 1, 456) , (2447234, 2, 1394); declare @t2 table (iden int identity primary key, id int, value int); insert into @t2 (id, value) values (2447234, 20) , (2447234, 68) , (2447234, -106) , (2447234, 160) , (2447234, 208) , (2447234, 1500); --select * from @t1; --select * from @t2; with cte as ( select t1.id, t1.rowId, t1.value as value1, t2.value as value2, t2.value as ssum , iter = 1, t2.iden as origIden, t2.iden from @t1 t1 join @t2 t2 on t2.id = t1.id union all select t1.id, t1.rowId, t1.value1 , t2.value , t1.ssum + t2.value, iter + 1, t1.origIden , t2.iden from cte t1 join @t2 t2 on t2.id = t1.id and t2.iden > t1.iden where t1.ssum + t2.value <= t1.value1 ) select * from cte order by rowID, id, origIden, iter 的实际成分为a,而-0.0的实际成分为b。字符串表示中省略了0.0

0.0被视为-1j,其中-(1j)的实际成分为1j。那个真实的组件被否定了。

0.0中,双方的实数分量为0,减法产生的实数为0。

在Python 2上,我认为0 - 1j可能会遇到用于使-1j-2147483648(依赖于平台)评估为int而不是long的特殊情况。特殊情况处理似乎导致-9223372036854775808的实际组件。