国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

賦值、淺拷貝和深拷貝的區(qū)別在哪?

2023-02-17 17:39 作者:云和數(shù)據(jù)何老師  | 我要投稿


賦值在 Python 中,對象的賦值就是簡單的對象引用,這點和 C++不同,如下所示:

a = [1,2,”hello”,[‘python’, ‘C++’]]

b = a
在上述情況下,a 和 b 是一樣的,他們指向同一片內(nèi)存,b 不過是 a 的別名,是引用。 我們可以使用 b is a 去判斷,返回 True,表明他們地址相同,內(nèi)容相同,也可以使用 id()函數(shù)來查看兩個列 表的地址是否相同。


賦值操作(包括對象作為參數(shù)、返回值)不會開辟新的內(nèi)存空間,它只是復制了對象的引用。也就是 說除了 b 這個名字之外,沒有其他的內(nèi)存開銷。修改了 a,也就影響了 b,同理,修改了 b,也就影響了 a。

淺拷貝會創(chuàng)建新對象,其內(nèi)容非原對象本身的引用,而是原對象內(nèi)第一層對象的引用。 淺拷貝有三種形式:切片操作、工廠函數(shù)、copy 模塊中的 copy 函數(shù)。 比如上述的列表 a;

切片操作:b = a[:] 或者 b = [x for x in a];工廠函數(shù):b = list(a);

copy 函數(shù):b = copy.copy(a);


淺拷貝

淺拷貝產(chǎn)生的列表 b 不再是列表 a 了,使用 is 判斷可以發(fā)現(xiàn)他們不是同一個對象,使用 id 查看,他們也 不指向同一片內(nèi)存空間。但是當我們使用 id(x) for x in a 和 id(x) for x in b 來查看 a 和 b 中元素的地址時,可以 看到二者包含的元素的地址是相同的。

在這種情況下,列表 a 和 b 是不同的對象,修改列表 b 理論上不會影響到列表 a。

但是要注意的是,淺拷貝之所以稱之為淺拷貝,是它僅僅只拷貝了一層,在列表 a 中有一個嵌套的 list,如 果我們修改了它,情況就不一樣了。

比如:a[3].append(‘java’)。查看列表 b,會發(fā)現(xiàn)列表 b 也發(fā)生了變化,這是因為,我們修改了嵌套的 list,修 改外層元素,會修改它的引用,讓它們指向別的位置,修改嵌套列表中的元素,列表的地址并未發(fā)生變化,指向 的都是用一個位置。

深拷貝(deep copy)

深拷貝只有一種形式,copy 模塊中的 deepcopy()函數(shù)。深拷貝和淺拷貝對應,深拷貝拷貝了對象的所有元素,包括多層嵌套的元素。因此,它的時間和空間開銷要高。

同樣的對列表 a,如果使用 b = copy.deepcopy(a),再修改列表 b 將不會影響到列表 a,即使嵌套的列表具有更深的層次,也不會產(chǎn)生任何影響,因為深拷貝拷貝出來的對象根本就是一個全新的對象,不再與原來的對象有任何的關聯(lián)。

注意:對于非容器類型,如數(shù)字、字符,以及其他的“原子”類型,沒有拷貝一說,產(chǎn)生的都是原對象的引用。 如果元組變量值包含原子類型對象,即使采用了深拷貝,也只能得到淺拷貝。


賦值、淺拷貝和深拷貝的區(qū)別在哪?的評論 (共 條)

分享到微博請遵守國家法律
盘锦市| 博爱县| 牟定县| 若羌县| 湾仔区| 凌源市| 从化市| 博乐市| 岳西县| 南汇区| 德安县| 合山市| 喀什市| 庆安县| 镇雄县| 龙岩市| 电白县| 河南省| 沙洋县| 册亨县| 荃湾区| 论坛| 浙江省| 广水市| 乐山市| 虎林市| 宜宾县| 峨边| 小金县| 尼玛县| 台前县| 华蓥市| 五寨县| 眉山市| 两当县| 青铜峡市| 通渭县| 东乡| 贵阳市| 旌德县| 阳东县|