與列表第一次測試:
In [1109]: a=[0,1,2,3,4]
In [1112]: b=a[1:3]
In [1113]: id(a[1])
Out[1113]: 139407616
In [1114]: id(b[0])
Out[1114]: 139407616
In [1115]: a[1] is b[0]
Out[1115]: True
後來我試着
In [1129]: id(1)
Out[1129]: 139407616
所以在a[1]
對象是一致的整數1
(整數id
是有點棘手,並依賴於實現)。
但是以與陣列:
In [1118]: aa=np.arange(5)
In [1119]: ba=aa[1:]
In [1121]: aa[1]
Out[1121]: 1
In [1122]: ba[0]
Out[1122]: 1
In [1123]: id(aa[1])
Out[1123]: 2925837264
In [1124]: id(ba[0])
Out[1124]: 2925836912
id
是完全不同的;事實上,他們與每個接入改變:
In [1125]: id(aa[1])
Out[1125]: 2925837136
In [1126]: id(ba[0])
Out[1126]: 2925835104
這是因爲aa[1]
不僅僅是整數1
。這是一個np.int32
對象。
In [1127]: type(aa[1])
Out[1127]: numpy.int32
相反到列表,數組的值存儲爲在databuffer
字節。 b[1:]
是view
並訪問相同的數據緩衝區。但a[1]
是一個新的對象,它包含對該數據緩衝區的引用。與列表案例相反,a[1]
不是a
中的第二個對象。
一般而言,id
在處理數組時無用,is
測試也沒有用。使用==
或isclose
(用於浮標)。
================
看的一種方法,其中被存儲的aa
的值是與:
In [1137]: aa.__array_interface__
Out[1137]:
{'data': (179274256, False), # 'id' so to speak of the databuffer
'descr': [('', '<i4')],
'shape': (5,),
'strides': None,
'typestr': '<i4',
'version': 3}
In [1138]: ba.__array_interface__
Out[1138]:
{'data': (179274260, False), # this is 4 bytes larger
'descr': [('', '<i4')],
'shape': (4,),
'strides': None,
'typestr': '<i4',
'version': 3}
的data
指針的2陣列是相關的,因爲ba
是view
。
aa[1]
是數組狀態,也有數據緩衝區,但它不是視圖。
In [1139]: aa[1].__array_interface__
Out[1139]:
{'__ref': array(1),
'data': (182178952, False),
...}
這可能適用於包含指向對象的指針的列表。但是一個數組將數值存儲在數據緩衝區中。 'a [2]'是一個引用該緩衝區的新對象,但它的'id'與'a'或databuffer無關。所以'id'在處理數組時無用。 – hpaulj
http://stackoverflow.com/questions/3877230/why-does-id-id-and-id-id-in-cpython的半重複。我希望我們有一個「分割重複」功能。 – user2357112