一、深浅copy
赋值运算
1
2
3
4
5
6
|
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
例 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
1
2
3
4
5
6
|
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 深浅拷贝内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/mall_lucy/article/details/104531218