从0开始python学习-3.浅拷贝和深拷贝

文章详细阐述了Python中的浅拷贝和深拷贝概念。浅拷贝对于不可变数据类型如字符串不会改变内存地址,而对可变数据类型的拷贝,如果涉及多层级,则内层数据变化会影响拷贝后的数据。深拷贝则创建完全独立的数据副本,即使原数据变化,拷贝后的数据也不会受影响。copy模块的copy()函数实现浅拷贝,deepcopy()函数实现深拷贝。
摘要由CSDN通过智能技术生成

1. 浅拷贝

1.1 重新分配一块内存空间,里面新的元素指向原来元素的位置(类似软件的快捷方式)
str1 = '张三' #不可变数据类型
print(str1, id(str1))  # 张三 1758431924592
str2 = copy(str1)
print(str2, id(str2))  # 张三 1758431924592 >>>浅拷贝不会新建内容地址,使用的是原数据的内存地址
1.2 从copy方法源码得知list,set,dict并没有使用python封装的方法,进行浅拷贝是也会改变地址,只有使用python自身封装的copy方法才是python所定义的浅拷贝
list1 = ['张三']
list2 = copy(list1)
print(list1, id(list1)) # ['张三'] 2336295101952
print(list2,id(list2)) # ['张三'] 2336295101952
1.3 浅拷贝针对的为不可变数据类型,若拷贝的可变数据数据类型是多层级的情况,内层数据发生变化,则拷贝后的数据也会随之变化

1.4 浅拷贝若拷贝的是单层级的数据,则数据不受影响
list1 = ['张三']
listno = []  #新建一个list用于存放数据
print(list1, id(list1)) # ['张三'] 2336295101952
print(listno,id(list1)) # [] 2336295101952

list2 = copy(listno)
print(list2,id(list2)) # [] 2336292948608 >>>list进行copy的时候从copy方法源码得知list,set,dict并没有使用python封装的方法,python自身封装的copy方法才是浅拷贝
listno.extend([list1]) # 将list1作为整体添加到listno中,成为lidtno的内层数据
list_copy = copy(listno) # 将listno拷贝给lidt_copy
list3 = copy(list1) # 将list1拷贝给list3

list1.extend(['李四'])
print(list1, id(list1)) # ['张三', '李四'] 2336295101952
print(list_copy,id(list_copy)) # [['张三', '李四']] 2336292948608  >>>拷贝的可变数据数据类型是多层级的情况,内层数据发生变化,则拷贝后的数据也会随之变化
print(list3,id(list3)) # ['张三'] 2585952920128 >>>拷贝的是单层级的数据,则数据不受影响

2.深拷贝

2.1 重新分配一块内存空间,里面的新元素独立跟原来的数据是没有任何关联(独立的软件)
str1 = '张三'
print(str1, id(str1))  # 张三 2599287968112
str2 = deepcopy(str1)
print(str2, id(str2))  # 张三 2599287968112 >>>深拷贝会新建内存地址,拷贝后的数据使用新地址
2.2 深拷贝只会拷贝在拷贝动作时的数据,若拷贝后数据发生变化也不会受影响
list1 = ['张三']
listno = []  #新建一个list用于存放数据
print(list1, id(list1)) # ['张三'] 2336295101952
print(listno,id(list1)) # [] 2336295101952

list2 = deepcopy(listno)
print(list2,id(list2)) # [] 2336292948608 
listno.extend([list1]) # 将list1作为整体添加到listno中,成为lidtno的内层数据
list_copy = deepcopy(listno) # 将listno拷贝给lidt_copy
list3 = deepcopy(list1) # 将list1拷贝给list3

list1.extend(['李四'])
print(list1, id(list1)) # ['张三', '李四'] 2336295101952
print(list_copy,id(list_copy)) # [['张三']] 2336292948608  >>>深拷贝只会拷贝当前的数据,若数据发生变化也不会受影响
print(list3,id(list3)) # ['张三'] 2585952920128

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值