python中有兩種數據類型:一種是可變數據類型,一種是不可變數據類型 不可變數據類型包括(整型及其他數據類型,字元串及元組) 可變數據類型(列表,集合,字典,類和類實例) 鑒定是否為拷貝還是只是引用計數加1,我們可以用python的內置函數(id())來驗證. 程式運行結果表明s和s1的記憶體地址是 ...
python中有兩種數據類型:一種是可變數據類型,一種是不可變數據類型
不可變數據類型包括(整型及其他數據類型,字元串及元組)
可變數據類型(列表,集合,字典,類和類實例)
鑒定是否為拷貝還是只是引用計數加1,我們可以用python的內置函數(id())來驗證.
s = "123" s1 = s print(id(s),id(s1))
程式運行結果表明s和s1的記憶體地址是相同的,所以他們不屬於拷貝,只是引用計數加1
下麵我們來使用python的內置函數copy試一下看能否真正實現拷貝
s = [[1,2],3,4] s1 = s.copy() print(id(s),id(s1))
從上面的運行結果來看,好像是拷貝了一份s給s1,但是我們再看一段下麵的程式
s = [[1,2],3,4]
s1 = s.copy()
s1[0][1] = 1
s1[1] = 1
print(s,s1)
通過運行上面的代碼,我們可以看到,如果將原來s1下標為1的數字3改為1,s裡面的不變,但是如果改變s1列表中的下標為0的列表元素裡面的下標為1的數字,則原來的列表會改變。
為什麼的?因為s列表裡面的列表元素為可變數據類型,而python內置的函數copy雖然也是拷貝,但是只是拷貝原來變數中的不可變數據類型,可變數據類型只是引用加1,拷貝後和拷貝前變數中的可變數據類型的指針或者記憶體id是指向同一個地址或記憶體的。
這就能解釋為什麼改變拷貝後的變數裡面的可變數據類型會導致原來的變數裡面的數據改變,我們稱這種拷貝為淺拷貝。
既然上面稱之為淺拷貝,相對的也就有深拷貝,深拷貝能實現什麼呢?能否實現我們認知觀念中的那種拷貝形式?看下麵代碼
import copy s = [[1,2],3,4] s1 = copy.deepcopy(s) s1[0][1] = 1 s1[1] = 1 print(s,s1)
為了能實現深拷貝,我們首先需要引入一個copy模塊,從運行結果可以看出來,無論是改變拷貝後的可變數據類型還是不可變數據類型,都不會導致原來變數中的數據改變,以上的方法我們成為深拷貝!