Python学习【第3篇】:Python_ 深浅拷贝

Python:深浅拷贝

1. str / int / bool

#内存中开辟空间,将值取出来,两者地址不同(注意小数据池)
a = "alex"
b = copy.copy(a)
c = copy.deepcopy(a)
#两份地址
	b==a==c

2. List / Set / dict

# v1 = [1,2,3]
#
# v2 = copy.copy(v1)		#将第一层的空壳拷贝一份,里面元素地址一样(与v1中元素地址一样),没有新开辟内存
# print(id(v1),id(v2))      #不一样
# v3 = copy.deepcopy(v1)	#将v1中所有的可变类型数据拷贝(新建)一份,不可变类型跟浅拷贝一样,没有新开辟内存
# print(v1 is v3)
# print(id(v1),id(v3))      #不一样



# v1 = [1,2,[33,99]]
# #浅拷贝只拷贝了最外层
# v2 = copy.copy(v1)          # 将第一层的空壳拷贝一份,里面的数据都是指向v1中数据的内存
# print(id(v1),id(v2))        # 不一样
# print(id(v1[2]),id(v2[2]))  # 一样
#
# #深拷贝:拷贝嵌套层次中的所有可变类型
# v3 = copy.deepcopy(v1)      # 将v1中所有的可变类型数据拷贝(新建)一份,里面可变类型元素的地址不一样,不可变类型跟浅拷贝一样,新开辟了内存
# print(id(v1),id(v2))        # 不一样
# print(id(v1[2]),id(v2[2]))  # 不一样

3. 练习题

v1 = [1,2,3,{33,99}]  #可变数据类型 dict、list、set
v2 = copy.deepcopy(v1)
print(v1 == v2)         #True
print(v1 is v2)         #False
print(v1[0] is v2[0])   #True
print(v1[3] == v2[3])   #True
print(v1[3] is v2[3])   #False

4. 特殊情况

# #特殊情况:如果tuple里面有可变类型,那么深拷贝时会重新创建一份
# v1 = (1,2,3,4)
#
# v2 = copy.copy(v1)
# print(id(v1),id(v2))    # 一样
# v3 = copy.deepcopy(v1)
# print(id(v1),id(v3))    # 一样

# v1 = (1,2,3,[1,2,3],4)
# 
# v2 = copy.copy(v1)
# print(id(v1),id(v2))    # 一样
# v3 = copy.deepcopy(v1)
# print(id(v1),id(v3))    # 一样

注意:对元素中不可变类型,更新操作会另外开辟空间,不影响已经拷贝的

v1 = [1,2,3,4]
v2 = copy.copy(v1)
v1[1] = 99
for i in v1:
    print(i,end=' ')    # 1 99 3 4
print()
for i in v2:
    print(i,end=' ')    # 1 2 3 4
  • 总结:深浅拷贝都不能拷贝不可变数据类型,浅拷贝只拷贝最外层(相当于只拷贝一层),深拷贝拷贝所有嵌套层次的可变类型。
posted @ 2021-03-17 22:43  The1Yu  阅读(31)  评论(0)    收藏  举报