深拷贝、浅拷贝
1、浅拷贝
浅拷贝是对一个对象的最外层拷贝并重新分配地址空间,而内层对象还是原地址空间,保持不变。所以原对象内层对象变化,则拷贝后的对象内层也会发生变化。
例如:
import copy
a = [[1, 2], [3, 4]]
b = copy.copy(a)
print("a's id is:", id(a))
print("a[0]'s id is:", id(a[0]))
print("a[1]'s id is:", id(a[1]))
print("b's id is:", id(b))
print("b[0]'s id is:", id(b[0]))
print("b[1]'s id is:", id(b[1]))
输出:
a's id is: 140533609027272
a[0]'s id is: 140533608894984
a[1]'s id is: 140533609215816
b's id is: 140533612480712
b[0]'s id is: 140533608894984
b[1]'s id is: 140533609215816
2、深拷贝
深拷贝是对一个对象的所有层进行拷贝重新分配地址空间,相当于2个不同对象,只是对象的值相同而地址空间不同。
import copy
a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)
print("a's id is:", id(a))
print("a[0]'s id is:", id(a[0]))
print("a[1]'s id is:", id(a[1]))
print("\n")
print("b's id is:", id(b))
print("b[0]'s id is:", id(b[0]))
print("b[1]'s id is:", id(b[1]))
print("\n")
输出:
a's id is: 140507304421064
a[0]'s id is: 140507304288776
a[1]'s id is: 140507304609608
b's id is: 140507307886856
b[0]'s id is: 140507304421448
b[1]'s id is: 140507307886664
3、分片表达式
import copy
a = [[1, 2], [3, 4]]
b = a[:]
print("a's id is:", id(a))
print("a[0]'s id is:", id(a[0]))
print("a[1]'s id is:", id(a[1]))
print("\n")
print("b's id is:", id(b))
print("b[0]'s id is:", id(b[0]))
print("b[1]'s id is:", id(b[1]))
print("\n")
与copy.copy()一样属于浅拷贝
输出
a's id is: 140390722840264
a[0]'s id is: 140390722707976
a[1]'s id is: 140390723028808
b's id is: 140390726306056
b[0]'s id is: 140390722707976
b[1]'s id is: 140390723028808
4、字典的copy方法
d = {"name": "cj", "age": 18, "ball": [1, 3]}
e = d.copy()
print("d's id is:", id(d))
print("e's id is:", id(e))
print("\n")
print("d['ball']s id is:", id(d['ball']))
print("e['ball']'s id is:", id(e['ball']))
d['ball'].append(4)
print("d['ball']s id is:", d['ball'])
print("e['ball']'s id is:", e['ball'])
输出
d's id is: 140619243378296
e's id is: 140619243378368
d['ball']s id is: 140619028580552
e['ball']'s id is: 140619028580552
d['ball']s id is: [1, 3, 4]
e['ball']'s id is: [1, 3, 4]
TIPS:
1、copy.copy 对于不可变类型,不会拷贝只会指向该对象的地址空间,相当于赋值,深拷贝一样
2、copy.copy 对于可变类型,会进行浅拷贝,深拷贝还是会递归拷贝