2013-08-31 96 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