PYTHON學習0012:深淺COPY----2019-6-8

1、當變量爲字符串或者數字時,a=1,b=a時,b指向的並不是a的值,而是指向a的內存地址1,b=1。所以當吧a重新賦值後,比如a=666,b還是=1。其中,a和b只是內存地址1的標籤。
2、但當如果變量爲列表時,因爲在列表中,列表本身有一個內存地址,列表裏的元素也有自身獨立的內存地址,比如m=【1,2,4】,n=m,此時n指向的是m列表的內存地址(也就是說2個列表的內存地址是一樣的),而不是其內元素的內存地址,所以當列表m內的元素改變,比如m【0】=6時,m=【6,2,4】,此時n也跟着變爲n=【6,2,4】。列表裏面元素的改變導致其內存地址的改變不會改變列表的內存地址。
3、如果要實現2個列表完全獨立,也就是後賦值的列表裏的元素不隨着原始列表元素的變動而變動,就要使用copy函數,比如m=n.copy()
例子:s=【1,2,“a”】,f=s.copy()。此時f雖然=【1,2,“a”】,但是f和s的內存地址是不一樣的,f和s可以看做是內存地址的一個標籤,【1,2,“a”】可以看做是一個值。等於就是2個不同的內存地址共享了同一個值,分別是不同的標籤而已。所以當s列表裏的元素改變,s【2】=666時,s=【1,2,666】。f由於其內存地址沒變還是=【1,2,“a”】。
但如果是嵌套列表時,比如s=【1,2,【“pw”,18】】,f=s.copy()。此時f也是=【1,2,【“pw”,18】】,f和s的內存地址不一樣,但共享了元素的值,其中之列表【“pw”,18】是作爲單個元素的。如果此時改動s裏的子列表裏的值,比如s【2】【1】=23,此時s=【1,2,【“pw”,23】】,f也=【1,2,【“pw”,23】】。是因爲子列表裏元素的地址和子列表地址是不一樣且獨立的。copy函數只是共享了原始列表裏的元素的內存地址,而且只能COPY到列表裏元素的第一層,且子列表的元素地址的改動會改變元素的地址,但並不影響子列表的地址,所以但在嵌套列表裏,使用copy函數時,原始列表的子列表裏的元素改動,被賦值的列表的子列表的元素也一起改動。
這種copy就叫淺copy。

如果連子列表也要完全獨立,則要深copy:
需要導入模塊:
import copy
f=copy.deepcopy(s)#就能實現完全COPY
這個應用較少,知道這個概念即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章