代码是用jupyter notebook写的
说实话我也不清楚python里到底怎么看地址。。。
id、memoryview、numpy.ctypes.data得到的“地址”都不一样。。。
import numpy
from ctypes import string_at
x = numpy.arange(6).reshape(2,3) + 1
x
'''输出
array([[1, 2, 3],
[4, 5, 6]])
'''
# memoryview
print((x.data,type(x.data)))
print(x.ctypes.data)
'''输出
(<memory at 0x000002BA87710D40>, <class 'memoryview'>)
3000149354832
'''
print(string_at(x.ctypes.data,x.nbytes).hex())
print(x.data.hex())
'''输出
010000000200000003000000040000000500000006000000
010000000200000003000000040000000500000006000000
'''
x = x.T
print(x)
print(string_at(x.ctypes.data,x.nbytes).hex())
print(x.data.hex())
'''输出
[[1 4]
[2 5]
[3 6]]
010000000200000003000000040000000500000006000000
010000000400000002000000050000000300000006000000
'''
print(x.data)
print(x.ctypes.data)
'''输出
<memory at 0x000002BA87710D40>
3000149354832
'''
# 可以发现和转置前一样
数组转置只改变了读取顺序,没有改变内存中的内容(只是推测)
string_at是按照内存地址顺序读取的
memoryview似乎仍保留了数组的读取顺序
值得一提的是,重复执行上面的代码后,memoryview(x.data)的值没有发生变化,x.ctypes.data的值每次都会变
个人感觉后面的更像地址一点
参考https://blog.youkuaiyun.com/blogshinelee/article/details/104256214