1 # -*- coding: utf-8 -*-
2 # @author: Tele
3 # @Time : 2019/04/18 下午 3:53
4 # 深拷贝与浅拷贝
5 import copy
6
7 # 浅拷贝只拷贝一层(对于内部元素只是拷贝引用),创建新的对象
8 a = [1, 2, 11]
9 b = copy.copy(a)
10 print(id(a) == id(b)) # False,b指向了新的对象
11
12 c = [a]
13 d = copy.copy(c)
14 print(id(c) == id(d)) # False
15 a.append("asdad")
16 print(c[0] == d[0]) # True,说明内部的a拷贝时只拷贝了a的引用
17 print(c[0]) # [1, 2, 11, 'asdad']
18 print(d[0]) # [1, 2, 11, 'asdad']
19
20 print("*" * 30)
21
22 # 深拷贝完整的拷贝变量及其指向的对象
23 b = copy.deepcopy(a)
24 print(id(a) == id(b)) # False,b指向了新的对象
25
26 c = [a]
27 d = copy.deepcopy(c)
28 print(id(c) == id(d)) # False
29 a.append("asdad")
30 print(c[0] == d[0]) # False
31 print(c[0]) # [1, 2, 11, 'asdad', 'asdad']
32 print(d[0]) # [1, 2, 11, 'asdad']
33
34 # 对于不可变类型,copy与deepcopy都只是拷贝引用,不创建新的对象
35 t = (1, 23, 5)
36 c = copy.copy(t)
37 print(id(c) == id(t)) # True
38
39 d = copy.deepcopy(t)
40 print(id(d) == id(t) == id(c)) # True
41
42 # 对于不可变类型对象内部的元素,同样遵循上面的规则
43 a = ["asd", 123, 123]
44 t = (a, 1, 34)
45 c = copy.copy(t)
46 d = copy.deepcopy(t)
47 a.append("xx")
48 print(c[0] == t[0]) # True,对于元组内部的列表a拷贝引用
49 print(d[0] == t[0]) # False