【Python】如何选择赋值和拷贝
變量賦值就是給對(duì)象綁定一個(gè)名字,賦值多出一個(gè)對(duì)象。好比出生的時(shí)候父母給我們?nèi)×艘粋€(gè)大名后,再取一個(gè)小名并不來多出一個(gè)人來,只是多一個(gè)名字罷了。
對(duì)象賦值
兩個(gè)對(duì)象做比較有兩種方式,分別是:is與 == ,is比較的是兩個(gè)對(duì)象是否相同,通過對(duì)象的ID值可識(shí)別是否為相同對(duì)象,==比較的是兩個(gè)對(duì)象的值是否相等。x1 = [1,2,1] x2 = [1,2,1] print(x1 is x2) print(x1 == x2) print(id(x1)) print(id(x2)) False
True
2004573077256
2004573077448上面我們對(duì)x1和x2進(jìn)行賦值,相對(duì)于給兩個(gè)變量分別取了名字x1和x2,兩個(gè)名字雖然都是列表[1,2,1],但在內(nèi)存中是兩個(gè)獨(dú)立的不同的對(duì)象,占據(jù)不同的內(nèi)存空間,就好比兩個(gè)名字一樣的人,實(shí)則為兩個(gè)不同的人。
x3 = x2 print(x2 is x3) True 上面我們將x2對(duì)應(yīng)的對(duì)象綁定了一個(gè)新的名字叫x3,這就好比一個(gè)人,開始給他取了一個(gè)x2的大名,后來又給他取了一個(gè)x3的小名,本質(zhì)上還是同一個(gè)人,所以,x2和x3所指的其實(shí)是同一個(gè)對(duì)象。
通過x2修改對(duì)象時(shí),x3也會(huì)跟著變化,因?yàn)楸举|(zhì)上它們是同一個(gè)對(duì)象,這就好比一個(gè)人大名x2,小名x3,x2長(zhǎng)了一歲相對(duì)于x3也長(zhǎng)了一歲。
x2.append(2) print(x2) print(x3) [1, 2, 1, 2] [1, 2, 1, 2]
但是,當(dāng)我們給x2重新賦值時(shí),相當(dāng)于x2不再引用之前的對(duì)象,而引用新對(duì)象,x3依然引用之前的對(duì)象。好比一個(gè)人的大名x2和小名x3,給x2重新賦值就相當(dāng)于給另外一個(gè)人取大名x2,但是x3還是開始那個(gè)人的小名。
x2 = [3,4,3] print(x2) print(x3) [3, 4, 3] [1, 2, 1, 2]對(duì)象拷貝
有時(shí)我們需要復(fù)制一個(gè)對(duì)象,但是又不想對(duì)原對(duì)象產(chǎn)生副作用,肯定不能通過賦值給一個(gè)新變量來解決(因?yàn)橘x值會(huì)對(duì)新變量產(chǎn)生影響),所以 Python專門提供了一種拷貝機(jī)制,基于原對(duì)象快速創(chuàng)建出一個(gè)含有相同值的對(duì)象。該功能由copy模塊提供。import copy拷貝又分為淺拷貝和深拷貝。
a = [1,2,1] ac = copy.copy(a) #淺拷貝 adc = copy.deepcopy(a) #深拷貝 print(ac) print(adc)拷貝出來的對(duì)象只是值相同,實(shí)為不同的對(duì)象
print(a == ac ==adc) print(a is ac) print(a is adc) True False False
拷貝出來的對(duì)象不在受原來對(duì)象的影響
那么淺拷貝(shallow copy)與深拷貝(deep copy)有什么區(qū)別呢?
對(duì)于不可變對(duì)象,比如整數(shù)、字符串、元組、還有由這些不可變對(duì)象組成的集合對(duì)象,淺拷貝和深拷貝沒有區(qū)別,都是拷貝一個(gè)新對(duì)象。兩者的區(qū)別在于拷貝組合對(duì)象,比如列表中還有列表,字典中還有字典或者列表的情況時(shí),淺拷貝只拷貝了外面的殼子,里面的元素并沒有拷貝(里面的元素還是引用舊對(duì)象),而深拷貝則是把殼子和里面的元素都拷貝了一份新的。
x = [[5,6],[6,7],[7,2] ,[2,5] ,[4,9]] xc = copy.copy(x) #淺拷貝 xdc = copy.deepcopy(x) #深拷貝 print(x[0] is xc[0]) print(x[0] is xdc[0]) True False
我們可以通過下面看到列表中的列表在淺拷貝時(shí)會(huì)受列表中列表變化而改變
x[0].remove(5) print(x) print(xc) print(xdc) [[6], [6, 7], [7, 2], [2, 5], [4, 9]] [[6], [6, 7], [7, 2], [2, 5], [4, 9]] [[5, 6], [6, 7], [7, 2], [2, 5], [4, 9]]
淺拷貝只拷貝了x的對(duì)象外殼,里面的列表還是引用x里面列表的對(duì)象,深拷貝即拷貝了x的對(duì)象外殼,而且里面的列表的對(duì)象也拷貝了。
總結(jié)
以上是生活随笔為你收集整理的【Python】如何选择赋值和拷贝的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试基础:MantisBT的安装配置
- 下一篇: websocket python爬虫_p