很多的同學(xué)對拷貝都不陌生,但是在數(shù)據(jù)分析的時候會區(qū)分深拷貝淺拷貝,那么改如何區(qū)分呢?下面一起來看看吧!
簡介
```python
先問問大家,什么是拷貝?拷貝是音譯的詞,其實他是從copy這個英文單詞音譯過來的,那什么是copy? copy其實就是復(fù)制一份,也就是所謂的抄一份。深淺copy其實就是完全復(fù)制一份,和部分復(fù)制一份的意思。
```
### 前戲
```python
l1 = [1,2,3,['jason','tony']]
l2 = l1
l1[0] = 111
print(l1)??# [111, 2, 3, ['jason', 'tony']]
print(l2)??# [111, 2, 3, ['jason', 'tony']]
l1[3][0] = 'kevin'
print(l1)??# [111, 2, 3, ['kevin', 'tony']]
print(l2)??# [111, 2, 3, ['kevin', 'tony']]
"""
對于賦值運算來說,l1與l2指向的是同一個內(nèi)存地址,所以他們是完全一樣的,在舉個例子,比如張三李四合租在一起,那么對于客廳來說,他們是公用的,張三可以用,李四也可以用,但是突然有一天張三把客廳的的電視換成投影了,那么李四使用客廳時,想看電視沒有了,而是投影了,對吧?l1,l2指向的是同一個列表,任何一個變量對列表進(jìn)行改變,剩下那個變量在使用列表之后,這個列表就是發(fā)生改變之后的列表。
"""
```
### 淺拷貝
```python
#同一代碼塊下:
l1 = [1, 'jason', 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, 'jason', 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來說,只是在內(nèi)存中重新創(chuàng)建了開辟了一個空間存放一個新列表,但是新列表中的元素與原列表中的元素是公用的
"""
```
https://img2018.cnblogs.com/blog/1342004/201907/1342004-20190707213813739-610311010.png
### 深拷貝deepcopy
```python
# 同一代碼塊下
import copy
l1 = [1, 'jason', 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, 'jason', 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來說,列表是在內(nèi)存中重新創(chuàng)建的,列表中可變的數(shù)據(jù)類型是重新創(chuàng)建的,列表中的不可變的數(shù)據(jù)類型是公用的。
"""
```
https://img2018.cnblogs.com/blog/1342004/201907/1342004-20190707215330225-962818898.png
###?