1.深淺拷貝(⚠️重要)
1.1 淺拷貝
1.1.1 定義
只拷貝第一層的記憶體位址
1.1.2 淺拷貝示例
賦值 示意淺拷貝前先說明賦值
賦值共用同一塊記憶體空間,乙個變數的值改變,另乙個賦值的變數同時也改變
多個變數名指向同一塊記憶體空間
賦值示意圖
淺拷貝只拷貝第一層的記憶體位址
# 列表中淺拷貝有兩種方式lst = [1,1,3]new_lst = lst.copy()lst = [1,1,3]new_lst = lst[:]
淺拷貝只拷貝第一層的記憶體空間位址,淺拷貝的兩個變數是單獨的記憶體空間,不再是共用同乙個記憶體空間位址
淺拷貝單層元素示意圖(增加元素)
淺拷貝多層元素示意圖(修改元素)
淺拷貝多層元素示意圖(第二層增加元素)
1.1.3 淺拷貝總結
1.淺拷貝只複製第一層記憶體空間位址
1.淺拷貝,修改第一層元素或者追加元素,都是將舊指向改變為新指向,兩個變數互不影響
3.淺拷貝修改第二層及以下元素或者追加元素,修改的是兩個變數共用的值,此時修改會影響兩個變數
1.1.4 淺拷貝坑
1.2深拷貝
1.2.1 定義
不可變資料型別共用記憶體空間,可變資料型別開闢新的記憶體空間,不管巢狀多少層都是這樣的原理
1.2.2 深拷貝語法
import copy copy.deepcopy()
1.2.3 深拷貝示例
import copylst = [1,1,[3,4]]new_lst = copy.deepcopy(lst)print (id(lst[0]),id(new_lst[0])) #lst[0]為1,1是整型,是不可變資料型別 --> 共用記憶體空間位址4464777164 4464777164print (id(lst[-1]),id(new_lst[-1]))140663166316984 140663166494088 #lst[-1]為[3,4],[3,4]是列表,是可變資料型別 --> 新開闢記憶體空間位址
1.2.4 深拷貝原理圖
1.2.5 深拷貝總結
深拷貝中,不可變資料型別共用記憶體空間位址,可變資料型別開闢新的記憶體空間,不管巢狀多少層都是這樣
深淺拷貝以及深淺拷貝的方法
先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式 拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。執行結果 呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,name指標被分配一次記憶體,但是程式結束時該記憶體卻被釋放了兩次,會造成記憶...
拷貝和深淺拷貝
當list2為list的拷貝物件時,list內的可變資料型別變化,list2變化 list內的不可變資料型別變化,list2變化。總之 list變化list2一定變化 list 1,2,3,4,list2 list print list print list2 1,2,3,4,5 1,2,3,4,5...
12 深淺拷貝
複製物件的基本概念 複製乙個物件作為副本,它會開闢一塊新的記憶體 堆記憶體 來儲存副本物件,就像複製檔案一樣.即源物件和副本物件是兩塊不同的記憶體區域.物件具備複製功能,必須實現協議,協議.常用的可複製物件有 nsnumber,nsstring,nsarray,nsdictionary.nsmuta...