import numpy as np
aa=np.array([1,2])
aa.data
Out[278]: <memory at 0x000001BED39961C0>
id(aa[0])
Out[279]: 1919105783888
id(aa[0])
Out[280]: 1919105781968
id(aa.data[0])
Out[281]: 140709382463232
id(aa.data[0])
Out[282]: 140709382463232
aa.__array_interface__['data'][0]
Out[283]: 1919049863168
我有3个问题:
只有aa.data[0]列表本是是内存地址不会变,变得是内部元素的引用,修改其中某一项元素的值,或者添加几个元素,不会改变其本身的地址,只会改变其内部元素的地址引用,但是如果对其进行重新赋值操作时,就会给列表重新赋予一个地址,来覆盖之前的地址这时列表地址会发生改变。其余的变量只是保存了一个引用,并不是指值本身,变量的每一次初始化,都开辟了一个新的空间,将新内容的地址赋值给变量
我猜想 , 应该是每次调用aa.data或者 aa[0]的时候, np 都重新生成数据。
变量 aa入口是不变的。
1、aa.data的值 0x000001BED39961C0是数据所在内存地址
2、为什么数组元素的ID不断变化?在IPython中,每个用户输入都存储在历史记录中,在 print 之间创建对象,使得 aa[0] 对象不太可能放置在相同的内存地址。
也就是说,在IPython中一次执行两次打印时,两个对象的ID相同;但每次执行此操作时,ID不同,因为每次通过索引访问 ndarray 内部时,都会动态创建一个新的内存(缓冲区),所以两次输出id(aa[0])的结果不一样
https://stackoverflow.com/questions/66720113/how-does-memory-allocation-occur-in-numpy-array#
你看看这个,也许可能对你有帮助。
class Text:
def __init__(self):
pass
if __name__ == '__main__':
a = Text()
print(a)
第一个问题:准确来说是逻辑内存地址。
第二个问题:每次重新执行id(aa[0]),(你上次执行完,内存基本上已经被回收了,)所以每次执行结果(申请获取内存地址)是不一样的。具体你要看下numpy库的实现原理,内存是如何回收的。aa.data类似与在堆内存中常驻了,所以每次是一样的。
第三个问题:这两个怎么能够一样呢,肯定不一样啊,aa.array_interface['data'][0]这个就是数组元素的内存地址,又回归到第二个问题了。
题主遇到这种问题,建议看看源码。源码很清楚的,栈内存,堆内存建议好好看看