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

2018-08-22  本文已影响0人  用1心

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
上一篇下一篇

猜你喜欢

热点阅读