拷贝
2023-04-29 本文已影响0人
午字横
1 、is 和 == 的不同
- is是比较两个引用是否指向了同一个对象(引用比较)
- == 是比较两个对象的值是否相等(值比较)
2、深拷贝和浅拷贝
import copy
a=[1,2]
b=[3,4]
c=a,b
d= c #相当于浅拷贝 拷贝了引用,并没有拷贝内容,所以当再次给a复制的时候d的值也会变化
a.append(100)
print(id(a),a)
print(id(c),c)
print(id(d),d)
>>>
140555886182336 [1, 2, 100]
140555886213248 ([1, 2, 100], [3, 4])
140555886213248 ([1, 2, 100], [3, 4])
-
浅拷贝:
就是=
import copy
a=[1,2]
b=[3,4]
c=a,b
d=copy.copy(c) #浅拷贝 拷贝了引用,并没有拷贝内容,所以当再次给a复制的时候d的值也会变化
a.append(100)
print(id(a),a)
print(id(c),c)
print(id(d),d)
>>>
140623473328064 [1, 2, 100]
140623473379648 ([1, 2, 100], [3, 4])
140623473379648 ([1, 2, 100], [3, 4])
-
深拷贝 :
理解相当于创建一个全新的对象,这个对象除了内容跟拷贝的那个相当没有任何关系
import copy
a=[1,2]
b=[3,4]
c=a,b
d=copy.deepcopy(c) #深拷贝 对宇一个对象所有层次拷贝(递归),此时的d是一个全新的对象,再更改a的值不会对d产生影响
a.append(100)
print(id(a),a)
print(id(c),c)
print(id(d),d)
>>>
140003867186496 [1, 2, 100]
140003867207936 ([1, 2, 100], [3, 4])
140003867230976 ([1, 2], [3, 4])
2、切片和字典是浅拷贝
a=[1,2]
b=[3,4]
c=[a,b]
d=c[:]
print(id(d),d)
a.append(200)
print(id(d),d)
>>>
139748835851584 [[1, 2], [3, 4]]
139748835851584 [[1, 2, 200], [3, 4]]
copy.copy
对于可变类型,会进行浅拷贝copy.copy
对于不可变类型,不会拷贝,仅仅是指向
不可变数据类型
# 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,就称不可变数据类型,
# 包括:int(整型)、string(字符串)、tuple(元组)
x=1
print(id(x),x)
x=2
print(id(x),x)
可变数据类型
# 可变数据类型
# 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,就称可变数据类型。
# 包括:set(集合)、list(列表)、dict(字典)
a=dict(name="daming",age=19)
print(id(a),a)
#a.update({"gender":"female"})
a["gender"]="female"
print(id(a),a)
总结:
拷贝其实很简单,只是有时仅仅是最顶层的那个引用拷贝了,有时又编程了递归拷贝,到底用哪种?
简单来说,如果浅拷贝能用则用,否则再用深拷贝,这样节省内存
2023-04-26