las*_*ash 5 python pointers numpy
编辑
经过一些更多的摆弄,我到目前为止已经隔离了以下状态:
print()print()print()(显然一样与1D阵列)像这样:
>>> a = numpy.array([1,2,3], dtype="int32")
>>> a.data
<memory at 0x7f02e85e4048>
>>> a.data
<memory at 0x7f02e85e4110>
>>> a.data
<memory at 0x7f02e85e4048>
>>> a.data
<memory at 0x7f02e85e4110>
>>> a.data
<memory at 0x7f02e85e4048>
>>> print(a.data)
<memory at 0x7f02e85e4110>
>>> print(a.data)
<memory at 0x7f02e85e4110>
>>> print(a.data)
<memory at 0x7f02e85e4110>
>>> print(a.data)
<memory at 0x7f02e85e4110>
>>> print(a.data)
<memory at 0x7f02e85e4110>
>>> d = numpy.array([[1,2,3]], dtype="int32")
>>> d.data
<memory at 0x7f02e863ae48>
>>> d.data
<memory at 0x7f02e863a9e8>
>>> d.data
<memory at 0x7f02e863aac8>
>>> d.data
<memory at 0x7f02e863ae48>
>>> d.data
<memory at 0x7f02e863a9e8>
>>> d.data
<memory at 0x7f02e863aac8>
>>> print(d.data)
<memory at 0x7f02e863ae48>
>>> print(d.data)
<memory at 0x7f02e863a9e8>
>>> print(d.data)
<memory at 0x7f02e863ae48>
>>> print(d.data)
<memory at 0x7f02e863a9e8>
>>> print(d.data)
<memory at 0x7f02e863ae48>
>>> b = numpy.matrix([[1,2,3],[4,5,6]], dtype="int32")
>>> b.data
<memory at 0x7f02e863a9e8>
>>> b.data
<memory at 0x7f02e863ae48>
>>> b.data
<memory at 0x7f02e863aac8>
>>> b.data
<memory at 0x7f02e863a9e8>
>>> b.data
<memory at 0x7f02e863ae48>
>>> print(b.data)
<memory at 0x7f02e863aac8>
>>> print(b.data)
<memory at 0x7f02e863a9e8>
>>> print(b.data)
<memory at 0x7f02e863aac8>
>>> print(b.data)
<memory at 0x7f02e863a9e8>
>>> print(b.data)
<memory at 0x7f02e863aac8>
>>> c = numpy.matrix([[1,2,3],[4,5,6],[7,8,9]], dtype="int32")
>>> c.data
<memory at 0x7f02e863aac8>
>>> c.data
<memory at 0x7f02e863a9e8>
>>> c.data
<memory at 0x7f02e863ae48>
>>> c.data
<memory at 0x7f02e863aac8>
>>> c.data
<memory at 0x7f02e863ae48>
>>> c.data
<memory at 0x7f02e863a9e8>
>>> c.data
<memory at 0x7f02e863aac8>
>>> print(c.data)
<memory at 0x7f02e863ae48>
>>> print(c.data)
<memory at 0x7f02e863a9e8>
>>> print(c.data)
<memory at 0x7f02e863ae48>
>>> print(c.data)
<memory at 0x7f02e863a9e8>
>>> print(c.data)
<memory at 0x7f02e863ae48>
>>> e = numpy.array([[[0,1],[2,3]],[[4,5],[6,7]]], dtype="int32")
>>> e.data
<memory at 0x7f8ca0fe1048>
>>> e.data
<memory at 0x7f8ca0fe1140>
>>> e.data
<memory at 0x7f8ca0fe1048>
>>> e.data
<memory at 0x7f8ca0fe1140>
>>> e.data
<memory at 0x7f8ca0fe1048>
>>> print(e.data)
<memory at 0x7f8ca0fe1048>
>>> print(e.data)
<memory at 0x7f8ca0fe1048>
>>> print(e.data)
<memory at 0x7f8ca0fe1048>
Run Code Online (Sandbox Code Playgroud)
原始邮政
我的印象只是在python控制台中输入一个变量,回显一个简单描述它的值(和类型)的字符串.它以与print()不同的方式格式化,但我假设它们返回的值都是相同的.
当我尝试输出numpy对象的数据指针对象的地址时,只需输入变量每隔一次给我不同的值,而print()给出相同的值.
这表明两个操作的不同之处不仅在于输出的格式,还在于它们从何处获取信息.但这些额外的差异究竟是由什么组成的呢?
>>> a = numpy.array([0,1,2])
>>> a
array([0, 1, 2])
>>> print(a)
[0 1 2]
>>> print(a.data)
<memory at 0x7ff25120c110>
>>> print(a.data)
<memory at 0x7ff25120c110>
>>> print(a.data)
<memory at 0x7ff25120c110>
>>> a.data
<memory at 0x7ff25120c110>
>>> a.data
<memory at 0x7ff253099818>
>>> a.data
<memory at 0x7ff25120c110>
>>> a.data
<memory at 0x7ff253099818>
>>> a.data
<memory at 0x7ff25120c110>
Run Code Online (Sandbox Code Playgroud)
来自文档
\n\n\n\n\nndarray.数据
\n\n指向 array\xe2\x80\x99s 数据开头的 Python 缓冲区对象。
\n
这应该只是一个memoryview数据的一部分。
编辑,试图更清楚:
\n\n就我而言,一维数组每次都会给出新值 - 它不仅仅在两个值之间循环:
\n\nIn [196]: a = numpy.array([0, 1, 2])\n\nIn [197]: a.data\nOut[197]: <read-write buffer for 0x7f7de5934f80, size 24, offset 0 at 0x7f7de594d4b0>\n\nIn [198]: a.data\nOut[198]: <read-write buffer for 0x7f7de5934f80, size 24, offset 0 at 0x7f7de594df70>\n\nIn [199]: a.data\nOut[199]: <read-write buffer for 0x7f7de5934f80, size 24, offset 0 at 0x7f7de594d570>\n\nIn [200]: a.data\nOut[200]: <read-write buffer for 0x7f7de5934f80, size 24, offset 0 at 0x7f7de594d870>\nRun Code Online (Sandbox Code Playgroud)\n\n我认为这种行为不仅仅是 numpy 所特有的。看看会发生什么buffer:
In [222]: a = (\'123\' * 999)\n\nIn [223]: buffer(a)\nOut[223]: <read-only buffer for 0x7f7de003cbd0, size -1, offset 0 at 0x7f7de5955170>\n\nIn [224]: buffer(a)\nOut[224]: <read-only buffer for 0x7f7de003cbd0, size -1, offset 0 at 0x7f7de594ddb0>\n\nIn [225]: buffer(a)\nOut[225]: <read-only buffer for 0x7f7de003cbd0, size -1, offset 0 at 0x7f7de597a5b0>\n\nIn [226]: buffer(a)\nOut[226]: <read-only buffer for 0x7f7de003cbd0, size -1, offset 0 at 0x7f7de594de70>\nRun Code Online (Sandbox Code Playgroud)\n\n如果是Buffer,文档说(强调我的):
\n\n\n缓冲区(对象[,偏移量[,大小]])
\n\n对象参数必须是支持缓冲区调用接口的对象(例如字符串、数组和缓冲区)。将创建一个新的缓冲区对象,该对象引用对象参数。
\n
所以我想我们应该预料到地址内存会改变。然而,回到最初的问题,似乎缓存发生了,我同意你们俩的观点,这必须归结为某种优化。不幸的是,我无法在 Python 代码库中找到缓存发生的原因和情况。
\n