一文帶你搞懂Numpy中的深拷貝和淺拷貝
1. 引言
深拷貝和淺拷貝是Python中重要的概念,本文重點介紹在NumPy中深拷貝和淺拷貝相關(guān)操作的定義和背后的原理。
閑話少說,我們直接開始吧!
2. 淺拷貝
2.1 問題引入
我們來舉個栗子,如下所示我們有兩個數(shù)組a和b,樣例代碼如下:
import numpy as np a = np.array([1, 2, 3]) b = a print('a =', a) print('b =', b)
輸出如下:
a = [1 2 3]
b = [1 2 3]
此時如果我們對數(shù)組a做如下改變,代碼如下:
import numpy as np a = np.array([1, 2, 3]) b = a a [0] = 42 print('a =', a) print('b =', b)
那么我們的問題為: 此時b的值應(yīng)該為多少?
運行上述代碼后,我們得到輸出如下:
a = [42 2 3]
b = [42 2 3]
2.2 問題剖析
也許有人會覺得輸出應(yīng)該為a=[42 2 3] 和 b=[1 2 3] ,但是運行上述代碼后我們發(fā)現(xiàn)a和b的值均發(fā)生了相應(yīng)的改變。這主要是由于在Numpy中對變量的賦值操作,實際上發(fā)生的為淺拷貝。
換句話說,此時兩個變量指向同一塊內(nèi)存地址,如下所示:
所以,此時如果我們修改數(shù)組original_array中的某個元素,copy_array 由于和original_array公用同一塊內(nèi)存,所以其中的元素也會發(fā)生相應(yīng)的變化。
3. 深拷貝
3.1 舉個栗子
如果我們想要對Numpy數(shù)組執(zhí)行深拷貝,此時我們可以使用函數(shù)copy()。相關(guān)的樣例代碼如下:
import numpy as np a = np.array([1, 2, 3]) b = a.copy() print('a =', a) print('b =', b)
輸出如下:
a = [1 2 3]
b = [1 2 3]
此時,如果我們改變數(shù)組a中的元素,代碼如下:
import numpy as np a = np.array([1, 2, 3]) b = a.copy() a [0] = 42 print('a =', a) print('b =', b)
此時的代碼輸出如下:
a = [42 2 3]
b = [1 2 3]
3.2 探究原因
觀察上述輸出,我們可以清楚地看到數(shù)組a發(fā)生了改變而數(shù)組b沒有發(fā)生變化,這是由于我們使用了深拷貝。此時的內(nèi)存地址如下:
由于 original_array和copy_array指向不同的內(nèi)存地址空間,所以此時我們對original_array的改變并不會對copy_array帶來影響。
4. 技巧總結(jié)
經(jīng)過上述對深拷貝和淺拷貝的舉例和示例,相信大家都已有了清晰的認(rèn)識,接著我們對上述知識點進(jìn)行總結(jié),歸納如下:
4.1 判斷是否指向同一內(nèi)存
如果我們需要知道兩個變量是否指向同一塊內(nèi)存地址,我們可以方便地使用is操作。
淺拷貝示例:
a = np.array([1, 2, 3]) b = a print(b is a)
輸出如下:
True
深拷貝示例:
a = np.array([1, 2, 3]) b = a.copy() print(b is a)
輸出如下:
False
4.2 其他數(shù)據(jù)類型
盡管本文中所有的示例都使用了NumPy數(shù)組,但本文中所涉及的知識也適用于Python中的列表和字典等其他數(shù)據(jù)類型。
總之,我們需要時刻記載心中:在淺拷貝中,原始數(shù)組和新的數(shù)組共同執(zhí)行同一塊內(nèi)存;同時在深拷貝中,新的數(shù)組是原始數(shù)據(jù)的單獨的拷貝,它指向一塊新的內(nèi)存地址。
5. 總結(jié)
本文重點介紹了Python中對Numpy數(shù)組操作的淺拷貝和深拷貝的概念和背后的原理,同時給出了相應(yīng)的代碼示例。
到此這篇關(guān)于一文帶你搞懂Numpy中的深拷貝和淺拷貝的文章就介紹到這了,更多相關(guān)Numpy深拷貝 淺拷貝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)讀取Properties配置文件的方法
這篇文章主要介紹了Python實現(xiàn)讀取Properties配置文件的方法,結(jié)合實例形式分析了Python讀取Properties配置文件類的定義與使用相關(guān)操作技巧,需要的朋友可以參考下2018-03-03Python基于多線程實現(xiàn)抓取數(shù)據(jù)存入數(shù)據(jù)庫的方法
這篇文章主要介紹了Python基于多線程實現(xiàn)抓取數(shù)據(jù)存入數(shù)據(jù)庫的方法,結(jié)合實例形式分析了Python使用數(shù)據(jù)庫類與多線程類進(jìn)行數(shù)據(jù)抓取與寫入數(shù)據(jù)庫操作的具體使用技巧,需要的朋友可以參考下2018-06-06