0基礎(chǔ)學(xué)數(shù)據(jù)分析 深淺拷貝

很多的同學(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

###?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容