深浅copy

深浅copy                                

1,先看赋值运算。python

l1 = [1,2,3,['barry','alex']]
l2 = l1

l1[0] = 111
print(l1)  # [111, 2, 3, ['barry', 'alex']]
print(l2)  # [111, 2, 3, ['barry', 'alex']]

l1[3][0] = 'wusir'
print(l1)  # [111, 2, 3, ['wusir', 'alex']]
print(l2)  # [111, 2, 3, ['wusir', 'alex']]

对于赋值运算来讲,l1与l2指向的是同一个内存地址,因此他们是彻底同样的。app

2,浅拷贝copy。优化

#同一代码块下:
l1 = [1, '太白', True, (1,2,3), [22, 33]]
l2 = l1.copy()
print(id(l1), id(l2))  # 2713214468360 2713214524680
print(id(l1[-2]), id(l2[-2]))  # 2547618888008 2547618888008
print(id(l1[-1]),id(l2[-1]))  # 2547620322952 2547620322952

# 不一样代码块下:
>>> l1 = [1, '太白', True, (1, 2, 3), [22, 33]]
>>> l2 = l1.copy()
>>> print(id(l1), id(l2))
1477183162120 1477183162696
>>> print(id(l1[-2]), id(l2[-2]))
1477181814032 1477181814032
>>> print(id(l1[-1]), id(l2[-1]))
1477183162504 1477183162504

对于浅copy来讲,只是在内存中从新建立了开辟了一个空间存放一个新列表,可是新列表中的元素与原列表中的元素是公用的。spa

3,深拷贝deepcopy。code

# 同一代码块下
import copy
l1 = [1, 'alex', True, (1,2,3), [22, 33]]
l2 = copy.deepcopy(l1)
print(id(l1), id(l2))  # 2788324482440 2788324483016
print(id(l1[0]),id(l2[0]))  # 1470562768 1470562768
print(id(l1[-1]),id(l2[-1]))  # 2788324482632 2788324482696
print(id(l1[-2]),id(l2[-2]))  # 2788323047752 2788323047752

# 不一样代码块下
>>> import copy
>>> l1 = [1, '太白', True, (1, 2, 3), [22, 33]]
>>> l2 = copy.deepcopy(l1)
>>> print(id(l1), id(l2))
1477183162824 1477183162632
>>> print(id(0), id(0))
1470562736 1470562736
>>> print(id(-2), id(-2))
1470562672 1470562672
>>> print(id(l1[-1]), id(l2[-1]))
1477183162120 1477183162312

对于深copy来讲,列表是在内存中从新建立的,列表中可变的数据类型是从新建立的,列表中的不可变的数据类型是公用的。blog

1、数字和字符串内存

对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无心义,由于其永远指向同一个内存地址。ci

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import  copy
# ######### 数字、字符串 #########
n1  =  123
# n1 = "i am alex age 10"
print ( id (n1))
# ## 赋值 ##
n2  =  n1
print ( id (n2))
# ## 浅拷贝 ##
n2  =  copy.copy(n1)
print ( id (n2))
  
# ## 深拷贝 ##
n3  =  copy.deepcopy(n1)
print ( id (n3))

2、其余基本数据类型字符串

对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不一样的。string

一、赋值

赋值,只是建立一个变量,该变量指向原来内存地址,如:

1
2
3
n1  =  { "k1" "wu" "k2" 123 "k3" : [ "alex" 456 ]}
  
n2  =  n1

  

二、浅拷贝

浅拷贝,在内存中只额外建立第一层数据

1
2
3
4
5
import  copy
  
n1  =  { "k1" "wu" "k2" 123 "k3" : [ "alex" 456 ]}
  
n3  =  copy.copy(n1)

三、深拷贝

深拷贝,在内存中将全部的数据从新建立一份(排除最后一层,即:python内部对字符串和数字的优化)

1
2
3
4
5
import  copy
  
n1  =  { "k1" "wu" "k2" 123 "k3" : [ "alex" 456 ]}
  
n4  =  copy.deepcopy(n1)

 

赋值运算:
l1 = [1,2,3]
l2 = l1
l2.append(666)
print(l1,l2)        #[1, 2, 3, 666] [1, 2, 3, 666]
对于赋值运算来讲,指向的都是同一个内存地址,一直都不变

浅copy:

l1 = [11,22,33]
l2 = l1.copy()
l1.append(666)
print(l1,id(l1))        #[11, 22, 33, 666] 31203144
print(l2,id(l2))        #[11, 22, 33] 31203272
l1 = [11, 22, ['barry', [55, 66]], [11, 22]]
l2 = l1.copy( )
l1[2].append('alex')
#print(l1,id(l1))          #11, 22, ['barry', [55, 66], 'alex'], [11, 22]] 41723272
#print(l2,id(l2))   #  [11, 22, ['barry', [55, 66], 'alex'], [11, 22]] 41723336
print(l1, id(l1[-1]))
print(12, id (l2[-1]))
####

对于浅copy来讲,第一层建立的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,因此,对于第二层以及更深的层数来讲,保持一致性。

深copy:彻底独立  (复制其数据完彻底全放独立的一个内存,彻底拷贝,数据不共享)

深copy:彻底独立
import copy
l1 = [11,22, ['barry']]
l2 = copy.deepcopy(l1)
l1[2].append('alex')
print(l1,id(l1[-1]))   # [11,22, ['barry' , 'alex' ]] 42282312
print(l2, id(l2[-1]))  # [11,22, ['barry'] ] 42332680
相关文章
相关标签/搜索