前几天在看numpy与pandas时,看到一些数据的存储问题,个人很好奇。然后综合以前的知识与笔记复习一下,个人觉得不错。特来分享一下。。。
这里说三种数据的存储:非引用类型,引用类型,类。
非引用类型:
小整数,如:1,2,3,4,5,6.....
在python中,小整数类型都有一个特定的空间,当一个变量赋值时,这个变量会指向它,另外一个变量赋值这个值时,同样也是指向它(这个是废话)。
还是用例子说明吧。
通过上图可以看出,内在地址都是一样的,甚至连方法也是同一个内存地址,“ 1 ”是一个小整数。它们在内存里是有一个独立的空间的。不管是什么赋值都是指向它的。
这里说明一下,小整数在不同的环境下,范围也不同,那么超出的范围不管元素是否相同都会开辟新的空间。。。
这里a,b,c的元素都是小整数257,已经超出的范围。a与b的内存地址就不同了。c是由a来的,只是指向它,所以相同。
在PyCharm编译器中,它的范围是 [-5,+∞)
在其它环境中,它的范围是[-5,256] -------其它没用过,所以不知道。
一图看懂:
字符串(也叫字符串驻留)
当两人对象字符串相同时,它们使用的是内一个内存,但是有一个规则,那就是只允许由数字,字母,下划线组成才能字符串驻留。
字符串驻留其实就是等价于小整数。不同环境中,字符串驻留也不同,在pycharm中,字符串就不区分,都属于驻留。
引用类型:
如 list、tuple、dict等
在python中,引用类型在创建对象是,都会开辟一个存储空间,不管元素是不是相同。它不像非引用类型一样,相同元素都是指向同一内存地址。
粟子:
通过上在的例子,可以看出它们的值都是相等的,而l1与l2都是创建新的对象,即使值相同,内存地址也不同。l3是由l1来,指向的是l1的内在内存地址。
再看上面一个例子,l3是由l1来的,指向同一个位置,所以当l1的值改变时,l3的值也会改变。
一图看懂:
类:
上面说完了类型,这里说说一下类的分配。
当我们创建一个类并创建一个对象。会开辟一个内存空间。而这个内存空间是怎么分配的吗?
这里我们就要了解一下类的魔法方法了。
__new__(cls):这个魔法方法,是类开辟空间用的。
这里就复制我以前的笔记啦。
"""
__new__(cls):类中默认的函数,在创建对象时使用
特点:
在类中,__new__(cls)用来分配内存,在创建对象时,自动先调用该函数进行内存分配,再调用其它方法操作
注意事项:
在类中,当我重写该方法时,后面必须跟cls参数,必须有返回值,返回值必须是对象,一般调用父类的__new__方法
父类调用方法
object.__new__(cls)
super().__new__(cls)
扩展:
__del__(self):在对象删除后自动调用
__str__(self):当对象打印时使用用 如 print(对象名)
"""
class A():
def __init__(self):
print("我是_init_()方法")
def __new__(cls, *args, **kwargs): #分配内存
print("我是_new_()方法")
# return object.__new__(cls)
return super().__new__(cls)
a = A()
在这里说下,关于这方面的知识可以了解下,python的元素的深浅拷贝与内存回收机制。。。
本文是个人理解,如有错误和扩展,感谢留言。
推荐文章:https://www.cnblogs.com/geaozhang/p/7111961.html