从内存上看python的对象

python中有一个说法:一切皆是对象,怎么理解这句话呢?我们可以通过查看数字,字符串在内存中的表示形式来对这句话有个更深的认识。

那么,怎么查看对象在内存中是什么样的呢?可以先参考一些这篇文章:https://www.cnblogs.com/wujiecong/p/11583540.html

1.python的数字在内存中是什么样的?

#python3.7
from ctypes import string_at
from sys import getsizeof
from binascii import hexlify

a = 2333
print(hexlify(string_at(id(a),getsizeof(a))))

运行结果则是数字2333在内存中的数据的十六进制表示(变量a实际上是指向2333所在的内存地址

b‘0200000000000000e0316c93f87f000001000000000000001d090000‘

从结果来看,数字“2333”在内存中存储着不少的信息。我们可以按照PyObject结构将其拆解开来。

0200 0000 0000 0000
e031 6c93 f87f 0000
0100 0000 00000000
1d090000
 引用计数  类型    值

对以上数据进行校验:

1.2333的的16进制表示是91D,看来采用的是小端模式。2.通过sys.getrefcount()查看引用计数

3.int的子类是它本身

2.python会动态地给数字对象分配内存,那界限是什么呢?

经过试验,不同的环境机器有不同的界限,本机是0x3FFFFFFF

菜鸟的在线工具是0x7FFFFFFFFFFFFFFF

3.int对象的结构

查看源码里int对象的结构,与我们在内存上看到的一致。

typedef struct {
    Py_ssize_t ob_refcnt;
    struct _typeobject *ob_type;
    long ob_ival;
} PyIntObject

原文地址:https://www.cnblogs.com/wujiecong/p/11579132.html

时间: 2024-07-31 13:33:36

从内存上看python的对象的相关文章

将C++对象保存到共享内存上

将C++对象保存到共享内存上时,由于程序DWON掉或者其他原因停掉程序(不清除共享内存)重新拉起程序时,共享内存上C++对象的虚函数指针已经失效.为了使得不清除共享内存重启程序时C++对象仍然有效,需要恢复共享内存上C++对象的虚函数表,通过C++的placement new可以做到. 假设 void *pShmDataAddr是挂载后的共享内存地址,TData是存放的C++对象,共享内存上总共存放了MAX_OBJ_NUM个对象.具体做法如下. 当程序启动的时候执行操作: TData *pShm

Python 迭代对象、迭代器、生成器详解

在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让初学者一头雾水,本文将一一为大家进行介绍,希望对大家学习python有所帮助. 容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用 in ,  not in 关键字判断元素是否包含在容器

完全理解Python迭代对象、迭代器、生成器

在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让初学者一头雾水,我将用一篇文章试图将这些概念以及它们之间的关系捋清楚. 容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据

[转载]完全理解Python迭代对象、迭代器、生成器

译文地址:liuzhijun 在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让初学者一头雾水,我将用一篇文章试图将这些概念以及它们之间的关系捋清楚. 容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素

Python迭代对象、迭代器、生成器

在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让初学者一头雾水,我将用一篇文章试图将这些概念以及它们之间的关系捋清楚. 容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据

完全理解 Python 迭代对象、迭代器、生成器

2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 原文出处: liuzhijun 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢谢网友指正. 在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式

深入理解python(一)python语法总结:基础知识和对python中对象的理解

用python也用了两年了,趁这次疫情想好好整理下. 大概想法是先对python一些知识点进行总结,之后就是根据python内核源码来对python的实现方式进行学习,不会阅读整个源码,,,但是应该会把数据结构的实现.函数调用过程.以及python虚拟机的基本原理根据源码解释下. 当然限于笔者只是一个弱鸡,,,如内容有疏漏的地方或者是一些错误,希望看到的大佬不吝赐教. 第一部分 python语法总结 当然如果对python语法还是一无所知的同学请移步缪雪峰或者菜鸟教程等学习网站看一遍再过来,,,

python string 对象

上一篇的整数对象是定长数据,即C中的long型整数. 但是python中还大量存在着不定长的数据类型.如字符串对象 和整数对象一样,字符串对象的组成如下: PyStringObject定义如下: Ob_size就是实际使用的内存大小,在注释中:ob_sval contains space for 'ob_size+1' elements. 因为末尾需要额外包含一个0 byte来保证字符串的结束. 这个学过C语言的应该都不会陌生的.但是这只是一个字符数组,怎么能包含N个字符呢? 显然这只能是一个字

python 获取对象信息

当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type()判断: >>> type(123) <type 'int'> >>> type('str') <type 'str'> >>> type(None) <type 'NoneType'> 如果一个变量指向函数或者类,也可以用type()判断: >&