一、賦值
1、在python中,對象的賦值就是簡單的引用,a = [1,2,3], b=a,在上述情況下,a和b是一樣的,他們指向同一片內(nèi)存,b不過是a的別名,是引用,我們可以使用b is a去判斷,返回True,表名他們地址相同內(nèi)容也相同,也可以使用id()函數(shù)來查看.看兩個列表地址是否相同。
2、賦值操作(包括對象作為參數(shù)、返回值),不會開辟新的內(nèi)存空間,他只是賦值了對象的引用.也就是除了b這個名字之外,沒有其他的內(nèi)存開銷,修改了a也就影響了b,修改了b,也就影響了a。
淺拷貝會創(chuàng)建新的對象,其內(nèi)容非原對象本身的引用,而是原對象內(nèi)第一層對象的引用。
淺拷貝有三種形式:
切片操作
: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)存空間,但是當(dāng)我們使用id(x)for x in a 和id(x) for x in b 來查看a和b中元素地址時,可以看到二者包含的元素的地址時相同的。
在這種情況下列表a 和列表b是不同的對象,修改b理論上不會影響到列表a。
但是要注意的是淺拷貝之所以只拷貝了一層,在列表a中有一個嵌套的list,如果我們修改了它,情況就不一樣了,比如:a[3].append(“4”),查看列表b也發(fā)生了變化,這是因?yàn)槲覀冃薷牧饲短椎膌ist,修改外層元素,會修改它的引用,讓他指向別的位置,修改嵌套列表中的元素,地址未發(fā)生變化,指向的都是用一個位置。
三、深拷貝(deepcopy)
深拷貝只是一種形式,copy模塊中的deepcoopy()函數(shù),深拷貝拷貝了對象的所有元素,包括多層嵌套的元素,因此他的時間和空間開銷要高。
同樣的對列表a,如果使用b= copy.deepcopy(a),再修改列表b也不會影響到列表a,即使嵌套的列表具有更深的層次,也不會產(chǎn)生任何影響,因?yàn)樯羁截惪截惓鰜淼膶ο蟾揪褪且粋€全新的對象,不再與原來的對象有任何的聯(lián)系。
四、拷貝的注意點(diǎn)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
