美文网首页
Python内存处理_引用、浅、深拷贝

Python内存处理_引用、浅、深拷贝

作者: 用1心 | 来源:发表于2018-08-22 21:42 被阅读0次

    2018-08-22

    1. 对象的创建,依赖于申请的内存空间中数据的加载,对象在内存中的创建过程依赖于三部分内存处理:对象分配内存地址、引用变量和引用变量之间的关系
      参考代码:
    from memory_profiler import profile 
     
     
    class Person: 
        ''' 自定义类型 ''' 
        def __init__(self, name, age, gender): 
            self.name = name 
            self.age = age 
            self.gender = gender 
     
    @profile(precision=10) 
    def main(): 
        ''' 入口函数 ''' 
        p = Person("tom", 18, "男") 
        print(p) 
        p2 = Person("tom", 18, "男") 
        print(p) 
     
    if __name__ == "__main__": 
        # 运行代码
     
        main() 
     
    

    执行内存处理:

    image.png

    内存分配图解:


    对于对象的创建,是将堆内存中的对象的地址临时存储在栈内存中变量中,那么在程
    序中如果要在多个地方使用一个对象数据时应该怎么办呢?一般想到的都是将对象像文件
    一样复制一份不就好了。
    Python中对于这样的情况,有三种不同的操作方式:
      如果程序中多个不同的地方都要使用同一个对象,通过对象的引用赋值,将同一个对象赋值给多个变量
      如果程序多个不同的地方都要使用相同的数据,通过对象的拷贝完成数据的简单复制即可,对象中的包含的数据必须统一
      如果程序中多个不同的地方使用相同的对象数据,通过对象的深层次的复制,将对象的数据完整复制成独立的另一份即可

    对象的引用赋值:
      可以将对象的内存地址同时赋值给多个变量,这个变量中存放的都是同一个对象的引用地址,如果通过一个变量修改了对象内容,那么其他变量指向的对象内容也会发生改变
      将一个变量中存放的对象的地址数据,赋值给其他变量,通过赋操作符号就可以完成


    image.png

    对象的引用变量的赋值,并不是对象的赋值和备份,而仅仅是将对象的地址存储在多个变量中方便程序操作


    image.png

    注意:PYTHON 中所谓对象的引用赋值,针对的是可变类型,不论是组合数据类型或者自定
    义 class 类型,都具备引用赋值的操作;但是不适合不可变类型,不可变类型的引用赋值
    操作有只读不写的特征,一旦通过变量重新赋值就会重新指向新的引用对象


    image.png

    对象的浅拷贝
      对于程序中对象的拷贝操作,除了前面介绍的引用赋值操作可以完成同一个对象在程序不
    同位置的操作,这里的浅拷贝更是一种对象的临时备份,浅拷贝的核心机制主要是赋值对象
    内部数据的引用
      PYTHON 内建标准模块 copy 提供了一个 copy 函数可以完成:

    image.png

    对象的深拷贝:
      和对象的浅拷贝不同,对象的深拷贝,是对象数据的直接拷贝,而不是简单的引用拷贝
    主要是通过 PYTHON 内建标准模块 copy 提供的 deepcopy 函数可以完成对象深拷贝 :


    image.png

    相关文章

      网友评论

          本文标题:Python内存处理_引用、浅、深拷贝

          本文链接:https://www.haomeiwen.com/subject/rqhuiftx.html