Python中的深浅拷贝详解

要说明Python中的深浅拷贝,可能要涉及到下面的一系列概念需要简单说明下:

变量-引用-对象(可变对象,不可变对象)切片-拷贝-浅拷贝-深拷贝

变量-对象-引用

在Python中一切都是对象,比如说:
3, 3.14, ‘Hello‘, [1,2,3,4],{‘a‘:1}......

甚至连type其本身都是对象,type对象

Python中变量与C/C++/Java中不同,它是指对象的引用

单独赋值: 比如说:

>>> a = 3

在运行a=3后,变量a变成了对象3的一个引用。在内部,变量事实上是到对象内存空间的一个指针

专业表述如下:

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

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

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

特别注意: 类型属于对象,不是变量

比如像刚才的a=3, 整数对象3包含了两重信息

1.
值为3

2.
一个头部信息:告诉Pthyon,这是个整数对象[相当于一个指向int的指针]

共享引用: 比如说

>>> a = 3

>>> b = a

在运行赋值语句b = a之后,变量a和变量b指向了同一个对象的内存空间.

从上图可以看到,a和b,其id完全一样,指向同一个整数对象3,或者说同一块内存

如果删掉a后, 不会影响b

可变对象-不可变对象

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

在Python中是指可以修改的对象,包括:列表、字典

上面说的a,b都是整数,整数是不可变对象,如果是可变对象的话,就是另外一回事了。

>>> L1 = [2,3,4]      #L1变量指向的是一个可变对象:列表
>>> L2 = L1           #将L1值赋给L2后,两者共享引用同一个列表对象[1,2,3,4]
>>> L1[0] = 200       #因为列表可变,改变L1中第一个元素的值
>>> L1; L2            #改变后,L1,L2同时改变,因为对象本身值变了
[200, 3, 4]
[200, 3, 4]

如果在实际上,不想出现改变L2的值,有两种方法:切片技术 和拷贝 

>>> L1 = [2,3,4]
>>> L2 = L1
>>> id(L1);id(L2)     #如果只是共享引用一个可变对象的话
45811784L
45811784L
>>> L2 = L1[:]        #切片后,对象就不一样了
>>> id(L1);id(L2)     #切片后,对象就不一样了
45811784L
45806920L
>>> L1[0] = 200
>>> L1;L2             #L1发生改变,L2没有变化
[200, 3, 4]
[2,   3, 4]

【拷贝】

1. 切片技术应用于所有的序列,包括:列表、字符串、元祖

>>>但该技术不会应用Python可变的核心类型字典.对字典只能使用D.copy()方法或D.deepcopy()方法.

2. 深浅拷贝,计可用于序列,也可用于字典

>>> import copy

>>> X = copy.copy(Y)      #浅拷贝:只拷贝顶级的对象,或者说:父级对象

>>> X = copy.deepcopy(Y)  #深拷贝:拷贝所有对象,顶级对象及其嵌套对象。或者说:父级对象及其子对象

  • 如果字典只有顶级对象:

  • 如果字典中嵌套对象:

【结论】

  • 深浅拷贝都是对源对象的复制,占用不同的内存空间
  • 如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
  • 如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝
时间: 2024-10-26 13:14:28

Python中的深浅拷贝详解的相关文章

Python中的高级数据结构详解

这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考下 数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据结构,分别是List.Tuple.Dictionary以及Set.大部分的应用程序不需要其他类型的数据结构,但若是真需要也有很多高级数据结构可供选择

Python中 if __name__ == '__main__': 详解

一个python文件就可以看作是一个python的模块,这个python模块(.py文件)有两种使用方式:直接运行和作为模块被其他模块调用. __name__:每一个模块都有一个内置属性__name__.而__name__的值取决与python模块(.py文件)的使用方式. 如果是直接运行,那么这个模块的__name__值就是“__main__”: 如果是作为模块被其他模块调用,那么这个模块(.py文件)的__name__值就是该模块(.py文件)的文件名,且不带路径和文件扩展名. 参考: ht

Python中的getattr()函数详解:

Python中的getattr()函数详解: getattr(object, name[, default]) -> value Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y. When a default argument is given, it is returned when the attribute doesn't exist; without it, an exception i

Python中格式化format()方法详解

Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参数使用{NUM}进行表示,0, 表示第一个参数,1, 表示第二个参数, 以后顺次递加; 使用":", 指定代表元素需要的操作, 如":.3"小数点三位, ":8"占8个字符空间等; 还可以添加特定的字母, 如: 'b' - 二进制. 将数字以2为基数

Python中的深浅拷贝

Python中的深浅拷贝 前言:我们在了解深浅拷贝之前首先需要明白的一点知识 不可变类型数据:不可变类型即指当改变其内元素时,内存空间将会发生变化,比如常见的不可变类型有:str,boolean, int,tuple. temp = "哈哈哈" ret = temp.replace("哈", "嘿", 2) print(temp) # 哈哈哈 print(ret) # 嘿嘿哈 # 我们可以看到temp的值并没有发生改变,这就是为什么对str数据改

Python中标准模块importlib详解

Python中标准模块importlib详解 模块简介 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外,importlib允许程序员创建他们自定义的对象,可用于引入过程(也称为importer). 什么是imp? 另外有一个叫做imp的模块,它提供给Python import语句机制的接口.这个模块在Python 3.4中被否决,目的就是为了只使用importlib. 这个模块有些复杂,因此我们在这

Python中self的用法详解,或者总是提示:TypeError: add() missing 1 required positional argument: 'self'的问题解决

https://blog.csdn.net/songlh1234/article/details/83587086 下面总结一下self的用法详解,大家可以访问,可以针对平时踩过的坑更深入的了解下. https://blog.csdn.net/CLHugh/article/details/75000104, Python中self的用法详解,或者总是提示:TypeError: add() missing 1 required positional argument: 'self'的问题解决 原文

python中的tcp示例详解

python中的tcp示例详解  目录 TCP简介 TCP介绍 TCP特点 TCP与UDP的不同点 udp通信模型 tcp客户端 tcp服务器 tcp注意点 TCP简介 TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义. TCP通信需要经过创建连接.数据传送.终止连接三个步骤. TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发

Python中的深浅拷贝,赋值及引用

简单来说,若对象a中存的是列表或字典等可变对象,b对a的浅拷贝只是对对象第一层的复制,修改b第二层的元素仍然会影响两个对象. 深拷贝则是不会影响原来的对象. import copy.copy() 浅拷贝 copy.deepcopy()  深拷贝 赋值操作更像是一个引用,新的赋值会创建一个新的内存地址,指向改变了,原来的内存地址还会存在. 参考文章地址: python基础(5):深入理解 python 中的赋值.引用.拷贝.作用域 http://my.oschina.net/leejun2005/