這看起來像內存重用的怪癖,而不是一個NumPy錯誤。
線
id(numpy.float64(100)) == id(numpy.float64(10))
首先創建一個浮子numpy.float64(100)
,然後它調用id
功能。這個內存然後被Python的垃圾回收器立即釋放,因爲沒有更多的引用。內存插槽可以被任何創建的新對象自由重用。
當創建了numpy.float64(10)
時,它佔用了相同的內存位置,因此返回的內存地址相當於id
。
這一連串事件也許是更清晰,當你看字節碼:
>>> dis.dis('id(numpy.float64(100)) == id(numpy.float64(10))')
0 LOAD_NAME 0 (id)
3 LOAD_NAME 1 (numpy)
6 LOAD_ATTR 2 (float64)
9 LOAD_CONST 0 (100)
12 CALL_FUNCTION 1 (1 positional, 0 keyword pair) # call numpy.float64(100)
15 CALL_FUNCTION 1 (1 positional, 0 keyword pair) # get id of object
# gc runs and frees memory occupied by numpy.float64(100)
18 LOAD_NAME 0 (id)
21 LOAD_NAME 1 (numpy)
24 LOAD_ATTR 2 (float64)
27 LOAD_CONST 1 (10)
30 CALL_FUNCTION 1 (1 positional, 0 keyword pair) # call numpy.float64(10)
33 CALL_FUNCTION 1 (1 positional, 0 keyword pair) # get id of object
36 COMPARE_OP 2 (==) # compare the two ids
39 RETURN_VALUE
這很迷人。 Python 3中的同樣處理:在解釋器中鍵入'id(numpy.float64(*))',其中'*'是一串隨機數,總是打印同樣的東西。 –
另請參閱:http://stackoverflow.com/q/17132047/270986 –