-2

A 是一个列表变量,定义如下:

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

为什么在python shell中执行时A[0]和的值相同?A[-0]

4

4 回答 4

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 浮点的更多信息。

于 2013-08-31T09:37:18.447 回答
4

因为-0是相同的0

>>> -0
0

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

也许您正在寻找-1相反的东西?负整数从末尾选择:

>>> A = [10, 78, "m", 89]
>>> A[0]
10
>>> A[-1]
89
于 2013-08-31T09:12:27.857 回答
2
>>> -0 == 0
True

所以基本上你在看同一个元素。

于 2013-08-31T09:23:02.257 回答
0

我认为你因为一个补码二进制补码而感到困惑。在一个补码中我们有 2 个零,而在二进制补码中我们只有一个零,现在有负零或正零。

于 2013-08-31T09:26:28.883 回答