(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) # 深拷贝
最外层对象的地址:浅拷vb.net教程贝和深拷贝都改变了
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]
内部可变对象的地址:浅拷贝没c#教程有改变,深拷贝改变了
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]
内部不可变对象的地址:浅拷贝和深python基础教程拷贝都没有改变
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
(1)最外层对象:浅拷贝在对象可变时改变了地址,不可变时没有改变地址;而深拷贝都会改变地址
(2)内部可变对象:浅拷贝都没有改变地址;深拷贝都会改变地址
(3)内部不可变对象:浅拷贝和深拷贝都没有改变地址
注:地址的改变,表示对原对象进行的修改不会对新对象产生影响。因此,在实际应用中,需根据需求选择是浅拷贝还是深拷贝。