关于id的话,这里面还有一个事儿,cpython实现中的id取的是对象的地址,而不是C意义上的数组元素的地址。
我猜你会不会是这么试的:
a = array.array('i')
a.append(...) #......
id(a[0])
id(a[1])
这个代码有个问题是python中的a[0]和c/c++中的a[0]的含义是不一样的。对于array,其中一个实现是:
static PyObject *
i_getitem(arrayobject *ap, Py_ssize_t i)
{
return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
}
也就是说当你取a[i]时,python很有可能为此操作新建了对象,此时id取的是新临时对象的地址而不是c语言意义上的数组基地址加偏移。
比如说
>>> a
array('i', [1239178023, 18234958, 901283917])
>>> id(a[0])
4343456464
>>> id(a[1])
4343458864
>>> id(a[2])
4343458672
>>> id(a.__getitem__(0))
4343456464
>>> b = a[0]
>>> id(b)
4343458864
>>> b = a[1]
>>> id(b)
4343456464
【 在 easior 的大作中提到: 】
: 多谢帮我确认array的实现
: 通过搜索我搞清了 id 的"地址":
: ctypes. cast(id(X), ctypes.py_object).value
: ...................
--
FROM 221.216.116.*