1 # 不可变对象
2 import copy
3
4 number1 = 1
5 stringA = 'A'
6 turple1 = (1, 2, 3, 4, 5)
7
8 # 可变对象
9 dict1 = {"key": 1}
10 list1 = [1, 2]
11
12 # 嵌套对象
13 # 外层不可变 内层不可变
14 turple2 = (turple1, stringA)
15 # 外层不可变 内层可变
16 turple3 = (list1, dict1)
17 # 外层可变 内层不可变
18 list2 = [turple1, stringA]
19 # 外层可变 内层可变
20 list3 = [dict1, list1]
21
22 # 浅拷贝 简单对象
23 # 引用
24 # number2 = copy.copy(number1)
25 # print(id(number1), id(number2))
26 # 引用
27 # stringA_2 = copy.copy(stringA)
28 # print(id(stringA), id(stringA_2))
29 # 引用
30 # turple1_2 = copy.copy(turple1)
31 # print(id(turple1), id(turple1_2))
32 # 新对象
33 # dict1_2 = copy.copy(dict1)
34 # print(id(dict1), id(dict1_2))
35 # 新对象
36 # list1_2 = copy.copy(list1)
37 # print(id(list1), id(list1_2))
38 '''
39 总结: 浅拷贝 简单对象
40 不可变对象是引用
41 可变对象是新对象
42 '''
43
44
45 # 外层引用 内层引用
46 # turple2_2 = copy.copy(turple2)
47 # print(id(turple2),"--",id(turple2[0]),id(turple2[1]))
48 # print(id(turple2_2),"--",id(turple2_2[0]),id(turple2_2[1]))
49
50 # 外层引用 内层引用
51 # turple3_2 = copy.copy(turple3)
52 # print(id(turple3),"--",id(turple3[0]),id(turple3[1]))
53 # print(id(turple3_2),"--",id(turple3_2[0]),id(turple3_2[1]))
54
55 # 外层新对象 内层引用
56 # list2_2 = copy.copy(list2)
57 # print(id(list2),"--",id(list2[0]),id(list2[1]))
58 # print(id(list2_2),"--",id(list2_2[0]),id(list2_2[1]))
59
60 # 外层新对象 内层引用
61 # list3_2 = copy.copy(list3)
62 # print(id(list3),"--",id(list3[0]),id(list3[1]))
63 # print(id(list3_2),"--",id(list3_2[0]),id(list3_2[1]))
64
65 '''
66 总结:浅拷贝 嵌套对象
67 内层都是引用,
68 外层对象不可变,外层引用
69 外层对象可变,外层新对象
70 '''
71
72 # 深拷贝 简单对象
73 # 引用
74 # number2 = copy.deepcopy(number1)
75 # print(id(number1), id(number2))
76 # 引用
77 # stringA_2 = copy.deepcopy(stringA)
78 # print(id(stringA), id(stringA_2))
79 # 引用
80 # turple1_2 = copy.deepcopy(turple1)
81 # print(id(turple1), id(turple1_2))
82 # 新对象
83 # dict1_2 = copy.deepcopy(dict1)
84 # print(id(dict1), id(dict1_2))
85 # 新对象
86 # list1_2 = copy.deepcopy(list1)
87 # print(id(list1), id(list1_2))
88 '''
89 总结: 深拷贝 简单对象
90 不可变对象是引用
91 可变对象是新对象
92 与浅拷贝结果一样
93 '''
94
95
96 # 外层引用 内层引用
97 # turple2_2 = copy.deepcopy(turple2)
98 # print(id(turple2),"--",id(turple2[0]),id(turple2[1]))
99 # print(id(turple2_2),"--",id(turple2_2[0]),id(turple2_2[1]))
100
101 # 外层新对象 内层新对象
102 # turple3_2 = copy.deepcopy(turple3)
103 # print(id(turple3),"--",id(turple3[0]),id(turple3[1]))
104 # print(id(turple3_2),"--",id(turple3_2[0]),id(turple3_2[1]))
105
106 # 外层新对象 内层引用
107 # list2_2 = copy.deepcopy(list2)
108 # print(id(list2),"--",id(list2[0]),id(list2[1]))
109 # print(id(list2_2),"--",id(list2_2[0]),id(list2_2[1]))
110
111 # 外层新对象 内层新对象
112 # list3_2 = copy.deepcopy(list3)
113 # print(id(list3),"--",id(list3[0]),id(list3[1]))
114 # print(id(list3_2),"--",id(list3_2[0]),id(list3_2[1]))
115
116 '''
117 总结:深拷贝 嵌套对象
118 内层是可变对象,内外层都是新对象,
119 内层是不可变对象,内层都是引用
120 此时
121 外层对象不可变,外层引用
122 外层对象可变,外层新对象
123 '''
124 '''
125 综上:
126 浅拷贝
127 简单对象
128 不可变对象是引用
129 可变对象是新对象
130 嵌套对象
131 内层都是引用,
132 外层对象不可变,外层引用
133 外层对象可变,外层新对象
134
135 深拷贝
136 简单对象
137 不可变对象是引用
138 可变对象是新对象
139 嵌套对象
140 内层是可变对象,内外层都是新对象,
141 内层是不可变对象,内层都是引用
142 此时
143 外层对象不可变,外层引用
144 外层对象可变,外层新对象
145
146 简单对象不受copy,deepcopy的影响,
147 不可变对象结果都是引用
148 可变对象结果都是新对象
149
150 对于嵌套对象
151 copy不是递归处理的,因为内层都是引用,没有递归到简单对象
152 的处理逻辑
153 外层可以当做简单对象理解,可变对象深拷贝,不可变引用
154
155 deepcopy递归处理,受到内层对象影响
156 内层可变,内外层都是深拷贝(即使外层不可变)
157 内层不可变,内层引用
158 此时外层按照简单对象处理
159
160
161
162
163 '''