1. 例子
(1)原物件(b1)可變
1 >>> import copy
2 >>> a1 = [1, 2, 3]
3 >>> a2 = 4
4 >>> b1 = [a1, a2]
5 >>> b2 = copy.copy(b1) # 淺拷貝
6 >>> b3 = copy.deepcopy(b1) # 深拷貝
- 最外層物件的地址:淺拷貝和深拷貝都改變了
1 >>> id(b1)
2 1664414246280
3 >>> id(b2)
4 1664414248328
5 >>> id(b3)
6 1664414247944
1 >>> b1.append(5)
2 >>> b1
3 [[1, 2, 3], 4, 5]
4 >>> b2
5 [[1, 2, 3], 4]
6 >>> b3
7 [[1, 2, 3], 4]
- 內部可變物件的地址:淺拷貝沒有改變,深拷貝改變了
1 >>> id(b1[0])
2 1664416938696
3 >>> id(b2[0])
4 1664416938696
5 >>> id(b3[0])
6 1664414247624
1 >>> a1.append('a')
2 >>> b1
3 [[1, 2, 3, 'a'], 4, 5]
4 >>> b2
5 [[1, 2, 3, 'a'], 4]
6 >>> b3
7 [[1, 2, 3], 4]
- 內部不可變物件的地址:淺拷貝和深拷貝都沒有改變
1 >>> id(b1[1])
2 140735360230128
3 >>> id(b2[1])
4 140735360230128
5 >>> id(b3[1])
6 140735360230128
(2)原物件(c1)不可變
1 >>> import copy
2 >>> a1 = [1, 2, 3]
3 >>> a2 = 4
4 >>> c1 = (a1, a2)
5 >>> c2 = copy.copy(c1)
6 >>> c3 = copy.deepcopy(c1)
- 最外層物件的地址:淺拷貝沒有改變,深拷貝改變了
1 >>> id(c1)
2 1664417250952
3 >>> id(c2)
4 1664417250952
5 >>> id(c3)
6 1664416938248
- 內部可變物件的地址:淺拷貝沒有改變,深拷貝改變了
1 >>> id(c1[0])
2 1664416938696
3 >>> id(c2[0])
4 1664416938696
5 >>> id(c3[0])
6 1664417297160
1 >>> a1.append('a')
2 >>> c1
3 ([1, 2, 3, 'a'], 4)
4 >>> c2
5 ([1, 2, 3, 'a'], 4)
6 >>> c3
7 ([1, 2, 3], 4)
- 內部不可變物件的地址:淺拷貝和深拷貝都沒有改變
1 >>> id(c1[1])
2 140735360230128
3 >>> id(c2[1])
4 140735360230128
5 >>> id(c3[1])
6 140735360230128
2. 總結
(1)最外層物件:淺拷貝在物件可變時改變了地址,不可變時沒有改變地址;而深拷貝都會改變地址
(2)內部可變物件:淺拷貝都沒有改變地址;深拷貝都會改變地址
(3)內部不可變物件:淺拷貝和深拷貝都沒有改變地址
注:地址的改變,表示對原物件進行的修改不會對新物件產生影響,因此,在實際應用中,需根據需求選擇是淺拷貝還是深拷貝,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/179640.html
標籤:Python
下一篇:Python_串列方法
