再說拷貝之前先說一說 is 與 ==
is 的作用是 比較兩個引用是否為乙個位址
== 是比較兩個值
a和b中實際儲存的就是一條位址,因為都賦值為2,所以就都存了記憶體單元中2的位址。也就是說如果增加乙個變數c ,另c=a或c=b,那麼c也指向的是2的記憶體位址;
接下來說拷貝,拷貝與 『=』 賦值不同,拷貝是在建立乙個空間,與原有的內容斷開了聯絡。
進行拷貝首先引入copy模組 import copy
淺拷貝: copy.copy()
例如 a = copy.copy(b)
說到這裡可能有人發現了一些小錯誤,不是說拷貝是另建空間嗎?怎麼使用了拷貝後 b is a 還是true?
這裡有涉及到了python對記憶體操作中的一點小知識:
在 python 中數字 字串,元組這些是不可變型別的,他們在記憶體中如果建立了位址就是固定的,如果另乙個變數值也為這些,那麼就會指向這個位址而不會再建立。所以即使使用了copy,也還是這個位址。而像列表等可變型別就會是另一種結果:
用乙個可變型別列表來分別執行淺拷貝與賦值操作這樣對比是不是更加容易理解呢
淺拷貝只是對於乙個物件的頂層拷貝:
什麼是頂層拷貝呢? 舉個栗子:
對列表a進行拷貝 ,b 和 a 是一樣的
對 a 追加乙個元素,b並未發生改變
如果是賦值的話,a變,b也會變。
回到拷貝上我們再對 a 追加乙個元素
當對列表a中的列表增加乙個元素時,b中的列表也相應增加了。
所以淺拷貝只是對物件的頂層拷貝,並未真正斷了所有聯絡!
深拷貝:copy.deepcopy()
例如 a = copy.deepcopy(b)
深拷貝與淺拷貝的區別就是深拷貝徹底斷了所有聯絡!
再次使用上面的例項演示一下:
由以上操作可以看出,深拷貝是一種底層遞迴拷貝。
在深拷貝的操作下,a與b之間是完全斷了聯絡的!
python中的拷貝
1.賦值 只是複製了新物件的引用,不會開闢新的記憶體空間。2.淺拷貝 建立新物件,其內容是原物件的引用。淺拷貝有三種形式 切片操作,工廠函式,copy模組中的copy函式。如 lst 1,2,3,4,5 切片操作 lst1 lst 或者 lst1 each for each in lst 要注意 l...
python淺拷貝 Python中的淺拷貝和深拷貝
在python中,賦值語句不複製物件,它們只是在目標和物件之間建立繫結。當我們使用 運算子時,使用者認為這會建立乙個新物件 好吧,其實並沒有。它只建立乙個共享原始物件引用的新變數。有時使用者想要使用可變物件,為了做到這一點,使用者希望找到建立這些物件的 真實副本 或 轉殖 的方法。或者,有時使用者想...
Python中的拷貝與深淺拷貝
即為賦值.舉個例子 a 147147 b a 賦值 print a is b true 對於淺拷貝,字典 列表 元組等型別,它們只拷貝第一層位址 import copy n1 n3 copy.copy n1 淺拷貝 print id n1 print id n3 print id n1 k3 pri...