首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python中如何查看指定内存地址的内容

python中如何查看指定内存地址的内容

作者头像
李拜六不开鑫
发布2020-02-17 11:41:19
2.8K0
发布2020-02-17 11:41:19
举报
文章被收录于专栏:本立2道生本立2道生

python中一般并不需要查看内存内容,但作为从C/C++过来的人,有的时候还是想看看内存,有时是为了验证内容是否与预期一致,有时是为了探究下内存布局。

from sys import getsizeof 
from ctypes import string_at

'''
getsizeof(...)
    getsizeof(object, default) -> int
    Return the size of object in bytes.
    
string_at(ptr, size=-1)
    string_at(addr[, size]) -> string
    Return the string at addr.
'''

getsizeof用于获取对象占用的内存大小,string_at用于获取指定地址、指定字节长度的内容,因为返回的对象类型是bytes,可以调用hex()函数转换成16进制查看。

int对象的内存内容如下,首先通过函数id获取对象的内存地址。

i = 100
type(i)
# int
s = string_at(id(i), getsizeof(i))
type(s)
# bytes
s
# b'>\x00\x00\x00\x00\x00\x00\x00\xa0\x99\xfd\x1d\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00'
s.hex()
# '3e00000000000000a099fd1d00000000010000000000000064000000'

如果对int对象的内存布局不熟悉,可能看不出什么。

再举一个numpy的例子。

>>> import numpy as np
>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

>>> a.data
<memory at 0x00000000062483A8>
>>> m = a.data
>>> type(m)
memoryview
>>> m.hex()
'000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b000000'

>>> a.ctypes.data
68393696
>>> string_at(a.ctypes.data, a.nbytes).hex()
'000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b000000'

上面展示的两个例子,一个是通过memoryview对象查看,另一个是通过string_at查看。不是所有对象都支持memoryview

class memoryview(obj) Create a memoryview that references obj. obj must support the buffer protocol. Built-in objects that support the buffer protocol include bytes and bytearray. —— from https://docs.python.org/3/library/stdtypes.html#memoryview

string_at

ctypes.string_at(address, size=-1) This function returns the C string starting at memory address address as a bytes object. If size is specified, it is used as size, otherwise the string is assumed to be zero-terminated. —— from https://docs.python.org/3/library/ctypes.html?highlight=string_at#ctypes.string_at

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档