2013-08-31 63 views
-2

甲遍历索引是一个列表变量定义如下:在Python列表

A= [10 ,78,"m",89] 

为什么的A[0]A[-0]相同的值时在Python壳执行?

+4

为什么* x * + 0与* x * - 0相同? – Johnsyweb

回答

4

因为-0相同0

>>> -0 
0 

您指的是相同指数,第一个值列表。没有负整数零这样的东西。

也许您正在寻找-1来代替?负整数从最终选择:

>>> A = [10, 78, "m", 89] 
>>> A[0] 
10 
>>> A[-1] 
89 
2
>>> -0 == 0 
True 

所以基本上你正在寻找相同的元素。

+0

这个测试是不够的,因为它在应用于浮点时产生误导结果:'-0.0 == 0.0',但是'str(-0.0)!= str(0.0)' – Eric

+0

@Eric同意。但'列表索引必须是整数,而不是浮点数。所以我只是想回答OP真正问到的问题。 – thefourtheye

0

我想你很困惑,因为one's complementtwo's complement。 在补码中,我们有2个零点,在二进制补码中,我们只有一个零点,现在有负值或正值零。

6

0-0是一样的,因为它们都是integer

>>> dis.dis(lambda x: 0) 
    1   0 LOAD_CONST    1 (0) 
       3 RETURN_VALUE 
>>> 
>>> dis.dis(lambda x: -0) 
    1   0 LOAD_CONST    1 (0) 
       3 RETURN_VALUE 
>>> 

然而,有一个负零和正零,与floatdouble。而且,解析器不会跳过符号:

>>> dis.dis(lambda: 0.0) 
    1   0 LOAD_CONST    1 (0.0) 
       3 RETURN_VALUE 
>>> dis.dis(lambda: -0.0) 
    1   0 LOAD_CONST    1 (-0.0) 
       3 RETURN_VALUE 
>>> 

在负零的情况下,最后一位是1和正零的情况下,最后一位是0。你可以在这里看到:

>>> from struct import pack, unpack 
>>> 
>>> # with float, 32th bit is 1 in negative zero 
>>> 
>>> '0x%.8x' % unpack('I', pack('f', -0.0))[0] 
'0x80000000' 
>>> '0x%.8x' % unpack('I', pack('f', 0.0))[0] 
'0x00000000' 
>>> 
>>> unpack('I', pack('f', -0.0))[0] >> 31 
1L 
>>> unpack('I', pack('f', 0.0))[0] >> 31 
0 
>>> 
>>> # same thing with double, 64th bit is 1 
>>> 
>>> '0x%.16x' % unpack('Q', pack('d', 0.0))[0] 
'0x0000000000000000' 
>>> '0x%.16x' % unpack('Q', pack('d', -0.0))[0] 
'0x8000000000000000' 
>>> 
>>> unpack('Q', pack('d', 0.0))[0] >> 63 
0 
>>> unpack('Q', pack('d', -0.0))[0] >> 63 
1L 
>>> 

你可以阅读更多关于IEEE floating point