拷贝

2023-04-29  本文已影响0人  午字横
1 、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不同

  1. copy.copy对于可变类型,会进行浅拷贝
  2. 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

上一篇 下一篇

猜你喜欢

热点阅读