深淺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
相關文章
相關標籤/搜索