淺拷貝就是對引用的拷貝,深拷貝就是對對象資源的拷貝。
1.賦值
1.賦值是將一個對象的地址賦值給一個變量,讓變量指向該地址;
2.修改不可變對象(字符串、數組等)須要給出新的空間;
3.修改可變對象(列表、字典等)不須要給出新空間。數組
2.淺拷貝
淺拷貝(切片、工廠函數、對象的copy()方法、copy模塊中的copy函數)僅僅複製了存儲空間中內容的地址app
>>> a = ['huhu', [1, 2]] >>> b = a[:] >>> [id(x) for x in a] [48401856, 48131728] >>> [id(x) for x in b] [48401856, 48131728] >>> a[0] = 'haha' >>> a[1].append(3) >>> a ['haha', [1, 2, 3]] >>> b ['huhu', [1, 2, 3]]
從上面的代碼能夠看出,a和b沒有修改前都是指向一個存儲空間的,即他們的內容和地址都是相同的。當a修改時,由於字符串是不可變對象,因此須要給出新的存儲空間來指定新的字符串,而列表就不用,因此b中字符串改變了,列表沒變。(至關於一臺電腦,a能夠用,而後b也想用,a就把能夠使用這臺電腦的權限賦予b,這樣ab公用這臺電腦)ide
3.深拷貝
深拷貝徹底拷貝了一個副本,存儲空間內容和地址都不同。
深拷貝只有一種方式:copy模塊中的deepcopy函數。函數
>>> from copy import deepcopy >>> a = ['huhu', [1, 2]] >>> b = deepcopy(a) >>> [ id(x) for x in a] [48401856, 48134104] >>> [ id(x) for x in b] [48401856, 48333048] >>> a[0] = 'haha' >>> a[1].append(3) >>> a ['haha', [1, 2, 3]] >>> b ['huhu', [1, 2]]
從這裏能夠看出深拷貝是徹底拷貝出來一個副本,從新給了一個存儲空間賦值給b,內容和地址與a不一樣。(至關於一臺電腦,a能夠用,而後b也想用,a就給b買了一臺如出一轍的電腦使用,這樣a用a的電腦,b用b的電腦)code