intellij idea使用教程 rinetd Nodepad ssh命令 Hibernate 反射 angularjs express class Draggabilly vue前端框架 angular视频教程 android经典项目开发实战 js鼠标离开事件 oracle查询所有数据库 查看oracle连接数 matlab四舍五入 matlab求矩阵最大值 edate函数的使用方法 git登录命令 bootstrap颜色 hbuilder插件 java 注解 python集合 java编程环境 java的包 java环境配置 java基本语法 java编译环境 javaif语句 java线程死锁 java接口规范 linux用户管理 linux下载安装 max电池容量 七宗罪游戏下载 脚本错误怎么解决 excel应用大全 qq钱包实名认证 流程图制作工具
当前位置: 首页 > 学习教程  > 编程学习

python笔试题深浅拷贝的关系

2021/1/9 2:04:50 文章标签: 深浅拷贝

变量与对象之间的关系 在许多语言中,对象跟变量都是很容易弄混淆的两个概念。 在上图中,我们把a赋值为5,那么是否就可以说a是一个整型对象呢。事实不是这样的,或者说这种说法不够严谨。 a只是一个变量,他的地址指向…

变量与对象之间的关系

在许多语言中,对象跟变量都是很容易弄混淆的两个概念。
在这里插入图片描述
在上图中,我们把a赋值为5,那么是否就可以说a是一个整型对象呢。事实不是这样的,或者说这种说法不够严谨。

a只是一个变量,他的地址指向了5这个整型对象。在这里插入图片描述

我们再把a的值赋给b,打印发现两个变量的id相同。说明两个变量指向了同一个对象。这个时候我们对a重新进行赋值。

在这里插入图片描述

这时候我们发现a的重新赋值,并不影响b的结果。事实上也是这样,a的重新赋值只是改变的a所指向的对象。并不会对b的地址造成影响,但是如果是对该对象的值进行修改呢。

我们都知道在python中,字符串,元组,整型这些对象创建成功后就无法改变了。但是像列表,字典这样的可变参数改变又会如何呢。

在这里插入图片描述
在列表a中,我们发现把a的值赋给了b。当a的值改变的话,b的值也自动进行了改变。就像焦不离孟一样死死的绑定一起。其实也不难理解,打印a,b的id发现id相同。a,b变量指向的是相同的对象。当对象改变的时候,变量的值自然而然的改变。

我们如果对b进行操作,a的值也会进行改变。
在这里插入图片描述

浅拷贝

这种行为我们可以理解,但是具体在使用的时候可能会出现问题。我们如何来解决这种问题,或者是摆脱这种依赖呢,就需要用到copy。
在这里插入图片描述
我们通过a拷贝出来b,虽然b的值与a的值相同。但是他俩的id却并不相同,说明a和b其实是指向了两个完全不相同的对象。

这个时候我们再对a,b进行操作看是否会有影响呢。

在这里插入图片描述
很显然,我们再对a和b进行操作的时候,并不会相互影响,因为他们是不同的对象,这样是不是就解决问题了呢,我们如果有一个二阶列表。

在这里插入图片描述
我们新定义了一个二阶列表a,同时b拷贝啊。打印a,b二者的id,两者的id当然不同。我们对b进行添加值时,事实上对a也没有影响。

但是当我们进行

b[-2].append('b')

a的值也受到了影响,这是为什么呢,我们不妨打印改变的这个子列表的id
在这里插入图片描述
这时候我们发现了问题的原因了,我们使用浅拷贝,确实改变了b的id,但是b的子列表的id依然引用了a的子列表的id,那么如何解决这个问题呢。

深拷贝

这个时候我们就需要借助深拷贝了deepcopy
在这里插入图片描述
这个时候我们发现,使用深拷贝之后,不但a与b的id不同,a和b的子列表的id也不相同,这样在进行他们的操作时就不会再产生任何影响了。

在这里插入图片描述


本文链接: http://www.dtmao.cc/news_show_1100285.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?