python元素内存地址分配

前几天在看numpy与pandas时,看到一些数据的存储问题,个人很好奇。然后综合以前的知识与笔记复习一下,个人觉得不错。特来分享一下。。。

这里说三种数据的存储:非引用类型,引用类型,类。

非引用类型:

小整数,如:1,2,3,4,5,6.....

在python中,小整数类型都有一个特定的空间,当一个变量赋值时,这个变量会指向它,另外一个变量赋值这个值时,同样也是指向它(这个是废话)。

还是用例子说明吧。

通过上图可以看出,内在地址都是一样的,甚至连方法也是同一个内存地址,“ 1 ”是一个小整数。它们在内存里是有一个独立的空间的。不管是什么赋值都是指向它的。

这里说明一下,小整数在不同的环境下,范围也不同,那么超出的范围不管元素是否相同都会开辟新的空间。。。

这里a,b,c的元素都是小整数257,已经超出的范围。a与b的内存地址就不同了。c是由a来的,只是指向它,所以相同。

在PyCharm编译器中,它的范围是 [-5,+∞)

在其它环境中,它的范围是[-5,256]   -------其它没用过,所以不知道。

一图看懂:

扫描二维码关注公众号,回复: 6143539 查看本文章

字符串(也叫字符串驻留)

当两人对象字符串相同时,它们使用的是内一个内存,但是有一个规则,那就是只允许由数字,字母,下划线组成才能字符串驻留。

字符串驻留其实就是等价于小整数。不同环境中,字符串驻留也不同,在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

猜你喜欢

转载自blog.csdn.net/fm345689/article/details/88385963