Python_浅拷贝与深拷贝

  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)    # 深拷贝

最外层对象的地址:浅拷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. 总结

(1)最外层对象:浅拷贝在对象可变时改变了地址,不可变时没有改变地址;而深拷贝都会改变地址

(2)内部可变对象:浅拷贝都没有改变地址;深拷贝都会改变地址

(3)内部不可变对象:浅拷贝和深拷贝都没有改变地址

注:地址的改变,表示对原对象进行的修改不会对新对象产生影响。因此,在实际应用中,需根据需求选择是浅拷贝还是深拷贝。

你可能感兴趣的:(C#教程,python基础教程,c#教程)