图解Python中的深浅拷贝

Python中的深浅拷贝

      • 1.【变量-对象-引用】
      • 2. 【浅拷贝】
      • 3. 【深拷贝】
      • 4. 【浅拷贝与深拷贝的区别】

【原文参考链接】

  • 超简单的图解 “ 深浅拷贝 ”
  • Python中的深浅拷贝详解

我们都知道,Python 是面向对象对象的编程语言,典型的例子就是和Java一样,一切皆对象;但它又和Java有所区别,Python是动态类型的语言,在程序运行时候,会根据对象的类型来确认变量到底是什么类型. 典型的例子就是JavaScript.

  • java中的类和对象

要说清楚Python中的深浅拷贝,需要了解下几个简单的概念:

1.【变量-对象-引用】

  • 变量:是一个系统表的元素,拥有指向对象的连接的空间

  • 对象:是被分配的一块内存,存储其所代表的值

  • 引用:是自动形成的从变量到对象的指针

单独赋值

a = 6

在运行a=6后,变量a变成了对象6的一个引用. 在内部,变量事实上是到对象内存空间的一个指针
图解Python中的深浅拷贝_第1张图片
因为Python的变量不过是对象的引用,或指向对象的指针,因此在程序中可以经常改变变量引用

赋值 含义
x = 42 变量绑定到整型对象
x = ‘Hello’ 变量绑定到字符串对象
x = [1,2,3] 变量绑定到列表对象

a = 6, 整数对象6包含了两重信息 :

  1. 值为6
  2. 一个头部信息:告诉Pthyon解释器,这是个整数对象(相当于一个指向int的指针)

共享引用(赋值)

比如说 a = 6
b = a

a 和 b 同时指向了同一个对象的内存地址
图解Python中的深浅拷贝_第2张图片
图解Python中的深浅拷贝_第3张图片a 和 b 所指向的地址相同

赋值 : 对象之间赋值本质上 是对象之间的引用传递而已。也就是多个对象指向同一个数据空间

【可变对象----不可变对象】

  • Python中不可变对象指:一旦创建就不可修改的对象,包括 字符串,元祖,数字

  • Python中可变对象是指:可以修改的对象,包括:列表、字典
    图解Python中的深浅拷贝_第4张图片

图解Python中的深浅拷贝_第5张图片
图解Python中的深浅拷贝_第6张图片

2. 【浅拷贝】

浅拷贝是对一个对象的顶层数据的拷贝


图解Python中的深浅拷贝_第7张图片
图解Python中的深浅拷贝_第8张图片
图解Python中的深浅拷贝_第9张图片
浅拷贝的三种方式:

person = ['name', 'age']

  1. p1 = copy.copy(person)
  2. p2 = person[:]
  3. p3 = list(person)

3. 【深拷贝】

深拷贝是对于一个对象所有层次的拷贝(递归)
图解Python中的深浅拷贝_第10张图片
图解Python中的深浅拷贝_第11张图片
图解Python中的深浅拷贝_第12张图片
图解Python中的深浅拷贝_第13张图片
图解Python中的深浅拷贝_第14张图片
图解Python中的深浅拷贝_第15张图片
图解Python中的深浅拷贝_第16张图片


4. 【浅拷贝与深拷贝的区别】

赋值与拷贝的区别

  • 赋值是引用的改变,而拷贝是重新开辟一片空间

深拷贝与浅拷贝的区别

  • 浅拷贝只是拷贝最外层数据,而深拷贝是递归拷贝所有层数据

图解Python中的深浅拷贝_第17张图片

  1. 深浅拷贝都是对源对象的复制,占用不同的内存空间
  2. 如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
  3. 如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝
  4. 序列对象的切片其实是浅拷贝,即只拷贝顶级的对象

【python中大部分方法都是浅拷贝如切片】
图解Python中的深浅拷贝_第18张图片
【字典的copy方法可以拷贝一个字典】

图解Python中的深浅拷贝_第19张图片
为什么Python中大多数都是浅拷贝呢?

  • 时间角度,浅拷贝花费时间更少
  • 空间角度,浅拷贝花费内存更少
  • 效率角度,浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高.

浅拷贝对不可变类型和可变类型的copy不同

  • copy.copy对于可变类型,会进行浅拷贝
  • copy.copycopy.deepcopy对于不可变类型没有意义,全部等价于对象之间的赋值操作

图解Python中的深浅拷贝_第20张图片
图解Python中的深浅拷贝_第21张图片
图解Python中的深浅拷贝_第22张图片

你可能感兴趣的:(Python,Python中的深浅拷贝,深浅拷贝)