【Python】如何选择赋值和拷贝
生活随笔
收集整理的這篇文章主要介紹了
【Python】如何选择赋值和拷贝
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在Python中,一切皆為對象,對象通過「變量名」引用,「變量名」更確切的叫法是「名字」,好比我們每個人都有自己的名字一樣,我們通過名字來代指某個人,代碼里面通過名字來指代某個對象。
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上面我們對x1和x2進行賦值,相對于給兩個變量分別取了名字x1和x2,兩個名字雖然都是列表[1,2,1],但在內存中是兩個獨立的不同的對象,占據不同的內存空間,就好比兩個名字一樣的人,實則為兩個不同的人。
x3 = x2 print(x2 is x3) True 上面我們將x2對應的對象綁定了一個新的名字叫x3,這就好比一個人,開始給他取了一個x2的大名,后來又給他取了一個x3的小名,本質上還是同一個人,所以,x2和x3所指的其實是同一個對象。
通過x2修改對象時,x3也會跟著變化,因為本質上它們是同一個對象,這就好比一個人大名x2,小名x3,x2長了一歲相對于x3也長了一歲。
x2.append(2) print(x2) print(x3) [1, 2, 1, 2] [1, 2, 1, 2]
import copy拷貝又分為淺拷貝和深拷貝。
a = [1,2,1] ac = copy.copy(a) #淺拷貝 adc = copy.deepcopy(a) #深拷貝 print(ac) print(adc)拷貝出來的對象只是值相同,實為不同的對象
print(a == ac ==adc) print(a is ac) print(a is adc) True False False
變量賦值就是給對象綁定一個名字,賦值多出一個對象。好比出生的時候父母給我們取了一個大名后,再取一個小名并不來多出一個人來,只是多一個名字罷了。
對象賦值
兩個對象做比較有兩種方式,分別是:is與 == ,is比較的是兩個對象是否相同,通過對象的ID值可識別是否為相同對象,==比較的是兩個對象的值是否相等。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上面我們對x1和x2進行賦值,相對于給兩個變量分別取了名字x1和x2,兩個名字雖然都是列表[1,2,1],但在內存中是兩個獨立的不同的對象,占據不同的內存空間,就好比兩個名字一樣的人,實則為兩個不同的人。
x3 = x2 print(x2 is x3) True 上面我們將x2對應的對象綁定了一個新的名字叫x3,這就好比一個人,開始給他取了一個x2的大名,后來又給他取了一個x3的小名,本質上還是同一個人,所以,x2和x3所指的其實是同一個對象。
通過x2修改對象時,x3也會跟著變化,因為本質上它們是同一個對象,這就好比一個人大名x2,小名x3,x2長了一歲相對于x3也長了一歲。
x2.append(2) print(x2) print(x3) [1, 2, 1, 2] [1, 2, 1, 2]
但是,當我們給x2重新賦值時,相當于x2不再引用之前的對象,而引用新對象,x3依然引用之前的對象。好比一個人的大名x2和小名x3,給x2重新賦值就相當于給另外一個人取大名x2,但是x3還是開始那個人的小名。
x2 = [3,4,3] print(x2) print(x3) [3, 4, 3] [1, 2, 1, 2]對象拷貝
有時我們需要復制一個對象,但是又不想對原對象產生副作用,肯定不能通過賦值給一個新變量來解決(因為賦值會對新變量產生影響),所以 Python專門提供了一種拷貝機制,基于原對象快速創建出一個含有相同值的對象。該功能由copy模塊提供。import copy拷貝又分為淺拷貝和深拷貝。
a = [1,2,1] ac = copy.copy(a) #淺拷貝 adc = copy.deepcopy(a) #深拷貝 print(ac) print(adc)拷貝出來的對象只是值相同,實為不同的對象
print(a == ac ==adc) print(a is ac) print(a is adc) True False False
拷貝出來的對象不在受原來對象的影響
那么淺拷貝(shallow copy)與深拷貝(deep copy)有什么區別呢?
對于不可變對象,比如整數、字符串、元組、還有由這些不可變對象組成的集合對象,淺拷貝和深拷貝沒有區別,都是拷貝一個新對象。兩者的區別在于拷貝組合對象,比如列表中還有列表,字典中還有字典或者列表的情況時,淺拷貝只拷貝了外面的殼子,里面的元素并沒有拷貝(里面的元素還是引用舊對象),而深拷貝則是把殼子和里面的元素都拷貝了一份新的。
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
我們可以通過下面看到列表中的列表在淺拷貝時會受列表中列表變化而改變
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的對象外殼,里面的列表還是引用x里面列表的對象,深拷貝即拷貝了x的對象外殼,而且里面的列表的對象也拷貝了。
總結
以上是生活随笔為你收集整理的【Python】如何选择赋值和拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试基础:MantisBT的安装配置
- 下一篇: mysql创建表时,表的类型与java的