python中的赋值、浅拷贝和深拷贝

背景:今天在做元胞自动机算法时,使用python语言编程采用了C语言面向过程的思维模式,在列表复制时,总是出现异常结果,后来才想到python中的赋值仅仅是拷贝了这个对象的引用,并没有拷贝这个对象。那今天的博客当做复习一下这三种拷贝。

1.赋值及其解释代码
2.浅拷贝及其解释代码
3.深拷贝及其解释代码
赋值:浅拷贝的一种,创建的对象将其赋值给另一个变量时,实际上并没有拷贝这个对象,而是拷贝了这个对象的引用,它们实际上还是同一个对象,内存地址相等。

 #解释代码:
list1 = [1, 2, 3, 4, [5, 6]]
new_list1 = list1
print('原列表', list1, '内存地址%d\n新列表' % id(list1), new_list1, id(new_list1), sep='  ')

list1[-1] = [7, 8, 9]
print('原列表', list1, '内存地址%d\n新列表' % id(list1), new_list1, id(new_list1), sep='  ')

list1[:3] = [4, 2, 3, 1]
print('原列表', list1, '内存地址%d\n新列表' % id(list1), new_list1, id(new_list1), sep='  ')

运行结果:在这里插入图片描述

浅拷贝:拷贝了这个对象,但是对象中引用的其他对象不拷贝。
深拷贝:拷贝这个对象,并拷贝对象中引用的其他对象。

#区别代码:
print('------------------------浅复制')
list2 = list1.copy()
print('拷贝后的list1和list2',list1,list2,sep='\n')
print('浅拷贝了list1后的list2,内存地址不相等','list1的内存地址:',id(list1), 'list2的内存地址:', id(list2))
print('浅拷贝不拷贝对象中引用的其他对象,可以从以下它们的内存地址看出list2并没有拷贝list1中的末尾列表,它们实际上还是一个对象')
print(id(list1[-1]), id(list2[-1]))

运行结果:
在这里插入图片描述

import copy
print('------------------------深复制')
list3=[520,1314,[1,2]]
new_list=copy.deepcopy(list3)
print(list3,new_list,sep='\n')
print('深拷贝拷贝这个对象和对象中引用的其他对象,可以看到他们的内存地址都不相等')
print(id(list3),id(new_list),id(list3[-1]),id(new_list[-1]))

在这里插入图片描述

内心:感觉CSDN上的代码模板不好看,不知道你们的代码是否和本仙女的一样鲜艳多彩。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值