代码是用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) '''输出 (, ) 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) '''输出3000149354832 ''' # 可以发现和转置前一样
数组转置只改变了读取顺序,没有改变内存中的内容(只是推测)
string_at是按照内存地址顺序读取的
memoryview似乎仍保留了数组的读取顺序
值得一提的是,重复执行上面的代码后,memoryview(x.data)的值没有发生变化,x.ctypes.data的值每次都会变
个人感觉后面的更像地址一点
参考https://blog.csdn.net/blogshinelee/article/details/104256214



