如何简单区分Python中的深拷贝与浅拷贝?
- 内容介绍
- 文章标签
- 相关推荐
本文共计825个文字,预计阅读时间需要4分钟。
一、浅拷贝与深拷贝浅拷贝与深拷贝是Python中处理列表拷贝时常用的概念。
浅拷贝(Shallow Copy):- 创建一个新的列表对象。- 将原列表中的元素(如果是可变对象,如列表)的引用复制到新列表中。
深拷贝(Deep Copy):- 创建一个新的列表对象。- 递归地复制原列表中的所有元素,包括嵌套的可变对象。
以下是一个浅拷贝和深拷贝的示例代码:
pythonl1=[1, 2, 3, [22, 33]]l2=l1.copy() # 浅拷贝l1.append(666)print(l1) # 输出: [1, 2, 3, [22, 33], 666]print(l2) # 输出: [1, 2, 3, [22, 33]]
在这个例子中,`l2` 是通过 `l1.copy()` 创建的浅拷贝。当我们在 `l1` 中添加元素 `666` 后,`l2` 中的内容没有变化,因为它们共享同一个内部列表 `[22, 33]` 的引用。
一、深浅copy
赋值运算
l1 = [1, 2, 3, [22, 33]] l2 = l1 l1.append(666) print(l1) # [1, 2, 3, [22, 33], 666] print(l2) # [1, 2, 3, [22, 33], 666]
图解:
注意:l2 = l1是一个指向,是赋值,和深浅copy无关。
浅copy
其实列表是一个一个的槽位,每个槽位存储的是该对象的内存地址
例1. 给大列表添加元素 l1 = [1, 2, 3, [22, 33]] l2 = l1.copy() # 或者下面这种方式,也是浅copy # import copy # l2 = copy.copy(l1) l1.append(666) print(l1) # [1, 2, 3, [22, 33], 666] print(l2) # [1, 2, 3, [22, 33]] 例2. 给小列表添加元素 l1 = [1, 2, 3, [22, 33]] l2 = l1.copy() l1[-1].append(666) print(l1) # [1, 2, 3, [22, 33, 666]] print(l2) # [1, 2, 3, [22, 33, 666]]、 例3. 将l1列表中第一个元素改为6 l1 = [1, 2, 3, [22, 33]] l2 = l1.copy() l1[0] = 6 print(l1) # [6, 2, 3, [22, 33]] print(l2) # [1, 2, 3, [22, 33]]
图解:
例1
例2
例3
总结:
浅copy:会在内存中新开辟一个空间,存放这个copy的列表,但是列表里面的内容还是沿用之前对象的内存地址。
注意:
切片中,如果是全切,属于浅copy。
深copy
import copy l1 = [1, 2, 3, [22, 33]] l2 = copy.deepcopy(l1) l1.append(666) print(l1) # [1, 2, 3, [22, 33], 666] print(l2) # [1, 2, 3, [22, 33]]
图解:
本质如下图:
但是python对深copy做了一个优化,将可变的数据类型在内存中重新创建一份,而不可变的数据类型则沿用之前的,所以内存中是下面这样的:
总结:
深copy:会在内存中开辟新空间,将原列表以及列表里面的可变数据类型重新创建一份,不可变数据类型则沿用之前的。
到此这篇关于图解Python中深浅copy(通俗易懂)的文章就介绍到这了,更多相关Python 深浅拷贝内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!
本文共计825个文字,预计阅读时间需要4分钟。
一、浅拷贝与深拷贝浅拷贝与深拷贝是Python中处理列表拷贝时常用的概念。
浅拷贝(Shallow Copy):- 创建一个新的列表对象。- 将原列表中的元素(如果是可变对象,如列表)的引用复制到新列表中。
深拷贝(Deep Copy):- 创建一个新的列表对象。- 递归地复制原列表中的所有元素,包括嵌套的可变对象。
以下是一个浅拷贝和深拷贝的示例代码:
pythonl1=[1, 2, 3, [22, 33]]l2=l1.copy() # 浅拷贝l1.append(666)print(l1) # 输出: [1, 2, 3, [22, 33], 666]print(l2) # 输出: [1, 2, 3, [22, 33]]
在这个例子中,`l2` 是通过 `l1.copy()` 创建的浅拷贝。当我们在 `l1` 中添加元素 `666` 后,`l2` 中的内容没有变化,因为它们共享同一个内部列表 `[22, 33]` 的引用。
一、深浅copy
赋值运算
l1 = [1, 2, 3, [22, 33]] l2 = l1 l1.append(666) print(l1) # [1, 2, 3, [22, 33], 666] print(l2) # [1, 2, 3, [22, 33], 666]
图解:
注意:l2 = l1是一个指向,是赋值,和深浅copy无关。
浅copy
其实列表是一个一个的槽位,每个槽位存储的是该对象的内存地址
例1. 给大列表添加元素 l1 = [1, 2, 3, [22, 33]] l2 = l1.copy() # 或者下面这种方式,也是浅copy # import copy # l2 = copy.copy(l1) l1.append(666) print(l1) # [1, 2, 3, [22, 33], 666] print(l2) # [1, 2, 3, [22, 33]] 例2. 给小列表添加元素 l1 = [1, 2, 3, [22, 33]] l2 = l1.copy() l1[-1].append(666) print(l1) # [1, 2, 3, [22, 33, 666]] print(l2) # [1, 2, 3, [22, 33, 666]]、 例3. 将l1列表中第一个元素改为6 l1 = [1, 2, 3, [22, 33]] l2 = l1.copy() l1[0] = 6 print(l1) # [6, 2, 3, [22, 33]] print(l2) # [1, 2, 3, [22, 33]]
图解:
例1
例2
例3
总结:
浅copy:会在内存中新开辟一个空间,存放这个copy的列表,但是列表里面的内容还是沿用之前对象的内存地址。
注意:
切片中,如果是全切,属于浅copy。
深copy
import copy l1 = [1, 2, 3, [22, 33]] l2 = copy.deepcopy(l1) l1.append(666) print(l1) # [1, 2, 3, [22, 33], 666] print(l2) # [1, 2, 3, [22, 33]]
图解:
本质如下图:
但是python对深copy做了一个优化,将可变的数据类型在内存中重新创建一份,而不可变的数据类型则沿用之前的,所以内存中是下面这样的:
总结:
深copy:会在内存中开辟新空间,将原列表以及列表里面的可变数据类型重新创建一份,不可变数据类型则沿用之前的。
到此这篇关于图解Python中深浅copy(通俗易懂)的文章就介绍到这了,更多相关Python 深浅拷贝内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

