[課堂筆記][pytorch學習][2]詞向量模型
阿新 • • 發佈:2021-07-08
深拷貝不會修改陣列 淺拷貝會修改陣列
首先要知道資料的型別
Number,String,null,Undefined,Object,Boolean
分成兩大類 :
基本資料型別,引用資料型別
基本資料型別:
Number,String,null,Undefined,Boolean
複雜資料型別:
Object(引用資料型別)
基本資料型別儲存在棧記憶體裡邊,引用資料儲存在堆記憶體裡邊,根本原因是在於儲存在棧記憶體的必須是大小固定的資料,引用型別的大小不固定,只能儲存在堆記憶體中,但是可以把他的地址寫在棧記憶體裡邊供我們訪問。
如果是基本資料型別,就按值訪問。操作的就是變數儲存的值,如果是引用型別的值,就通過儲存在變數中的引用地址來操作實際物件
一、複製:
1.基本資料型別的複製:
賦值的時候,在棧記憶體裡邊重新開闢記憶體,存放變數b,所以在棧記憶體裡邊分別存放著變數a,b的值,修改時候互補影響
2.引用型別的複製:
color1和color2指向的是堆記憶體中的同一個物件,複製的只是引用地址
二、深淺拷貝:
淺拷貝值複製物件的引用地址,而不是複製物件本身,新舊物件還是共享一個引用地址,但是深拷貝會創造一個一模一樣的物件,新物件不會和就物件共享記憶體,修改新物件不會影響舊物件。
1.淺拷貝:
定義:建立一個新物件,這個物件有原始物件的屬性值的一份精確拷貝,如果是基本資料的話拷貝的就是它的值,如果數引用資料型別,拷貝的就是它的堆記憶體的地址,修改一個物件 會影響另一個物件。值是相同的,但是地址也是新開闢的。
淺拷貝的幾種方法:
(1)、Object.assign()
對Object。assign而言如果物件的屬性值為簡單的型別(number,stringify)通過Object.assign()得到的新物件為深拷貝,如果屬性值為物件或者其他的引用型別,對這個物件來說就是淺拷貝
Object.assign({},src,src1)對於src src1之間相同的屬性是直接覆蓋的,如果屬性值為物件的話,是不會對 物件之間的屬性進行合併的
(2)slice和concat
只有一層的時候是深拷貝
多層的時候:
缺點:陣列的slice和concat只是會複製第一層,對於第一層的值都是深拷貝,而到了第二層的時候slice和concat就是複製引用
(3))lodash的clone函式
-.clone(value)
引數:
value(*)要深拷貝的值
返回
(*)返回拷貝後的值
例子:
深拷貝的方法:
(1)遞迴:
對屬性中所有的引用型別的值,遍歷到是基本資料為止
(2)JSON物件的parse和stringify
JSON物件中的stringify可以把js物件序列化成一個JSON字串,parse可以把JSON字串反序列化成為一個js物件,實現的是深拷貝
缺點:1.使用條件有限制JSON。stringify無法正確轉換正則表示式都會轉化成{}
2.如果obj裡面有時間物件,則JSON.stringify後再JSON.parse的結果,時間將只是字串的形式,而不是物件的形式
3.如果obj裡有函式,undefined,則序列化的結果會把函式或 undefined丟失
4.如果obj裡有NaN、Infinity和-Infinity,則序列化的結果會變成null
5.JSON.stringify()只能序列化物件的可列舉的自有屬性,例如 如果obj中的物件是有建構函式生成的, 則使用JSON.parse(JSON.stringify(obj))深拷貝後,會丟棄物件的constructor;
(3)lodash的cloneDeep函式
-.cloneDeep(value)
引數:
value(*)要深拷貝的值
返回
(*)返回拷貝後的值
例子:
(4)用的jqery裡面的extend方法;
var a = {
name: "zjam",
obj: {
am: "zaofnd",
dvd: "ddddd",
},
};
var b = $.extend(true, {}, a); // 第一個引數true為深拷貝,第二個引數為目標物件,第三個引數為源物件即你用拷貝那個資料
a.obj.am = "早上";
console.log(a);
console.log(b);
缺點:拷貝複雜物件的時候會報錯耗效能,內建的拷貝方法會比cloneDeep安全
三、深淺拷貝的主要區別就是:複製的是引用地址還是複製的值
什麼時候用深拷貝 /淺拷貝
無論深淺,都是需要的,當深拷貝發生時通常表明存在著一個聚合關係,
當淺拷貝發生時,通常表明存在著相識關係
舉個簡單例子:當實現一個組合模式 Composite Pattern 時通常都會實
現深拷貝
當實現一個觀察者模式 Observer Pattern,時,就需要實現淺拷貝