为什么对numpy数组元素调用id()函数会返回不同结果?
问题原因说明
你遇到的id不一致问题是numpy数组的底层存储机制和Python原生对象的差异导致的,核心原因如下:
- Python原生嵌套列表的每个元素本身就是独立的Python对象,列表仅存储这些对象的引用,你多次访问
list[0][0]拿到的都是同一个对象,id值自然相同。 - numpy数组是连续存储的同类型原始数值,并没有给每个元素单独创建对应的Python对象,你每次执行
a[0][0]时,numpy都会临时生成一个新的Python int包装对象来承载底层的原始值,这个临时对象在使用完成后就会被回收,两次调用生成的是不同的临时对象,因此id值不一样。
你可以通过下面的代码验证这个逻辑:
import numpy as np a = np.array([[0,1,2],[3,4,5],[6,7,8]]) # 把临时生成的包装对象赋值给变量持有,多次取同一个变量的id会一致 val = a[0][0] print(id(val)) print(id(val)) # 重新取数组元素会生成新的包装对象,id和之前的val不同 print(id(a[0][0]))
如果需要查看numpy数组对应位置底层原始值的真实内存地址,可以使用a[0,0].__array_interface__['data'][0],同一个位置的该值是固定不变的。
内容的提问来源于stack exchange,提问作者4cket
相关产品推荐
相关产品推荐

