一篇文章读懂Python赋值与拷贝


Posted in Python onApril 19, 2018

变量与赋值

在 Python 中,一切皆为对象,对象通过「变量名」引用,「变量名」更确切的叫法是「名字」,好比我们每个人都有自己的名字一样,咱们通过名字来代指某个人,代码里面通过名字来指代某个对象。

变量赋值就是给对象绑定一个名字,赋值并不会拷贝对象。好比我们出生的时候父母就要给我们取一个名字一样,给人取个绰号并不来多出一个人来,只是多一个名字罢了。

两个对象做比较有两种方式,分别是:is 与 == ,is比较的是两个对象是否相同,通过对象的ID值可识别是否为相同对象,==比较的是两个对象的值是否相等

>>> x1 = [1,2]
>>> x2 = [1,2]
>>> x1 is x2
False
>>> id(x1)
4338854088
>>> id(x2)
4338904392
>>> x1 == x2
True

x1 和 x2 的值虽然相同,但在内存中是两个独立的不同的对象,占据不同的内存空间,就好比两个长得一样的苹果摆在桌子上,实则为两个不同的物体。

>>> x3 = x2
>>> x3 is x2
True
>>> id(x3)
4338904392

前面说了,赋值是给对象绑定名字,这里我们只不过是给 x2 对应的那个对象绑定了一个新的名字叫 x3,这就好比桌上放了一个苹果,开始给它贴了一个 x2 的标签,后来又给它添了一个 x3 的标签,本质上还是同一个苹果,所以,x2 和 x3 所指的其实是同一个对象。

一篇文章读懂Python赋值与拷贝

通过x2 修改对象时,x3 也会跟着变化,因为本质上它们是同一个对象,这就好比张三和小张是同一个人时,给张三添衣服其实就是给小张添衣服。

>>> x2.append(3)
>>> x2
[1, 2, 3]
>>> x3
[1, 2, 3]

但是,当我给 x2 重新赋值时,相当于 x2 不再引用之前的对象,而引用新对象, x3 依然引用之前的对象。好比桌上一大苹果开始贴了 x2 和 x3 两个标签,给 x2 重新赋值就相当于把 x2 标签贴到另外一个苹果,但是 x3 还是贴在老苹果身上。

>>> x2 = [3, 4]
>>> x3
[1, 2, 3]

一篇文章读懂Python赋值与拷贝

对象拷贝

在业务中有时我们需要复制一个对象,但是又不想对原对象产生副作用,肯定不能通过赋值给一个新变量来解决(因为赋值不是拷贝对象),所以 Python 专门提供了一种拷贝机制,基于原对象快速创建出一个含有相同值的对象。该功能由copy模块提供。

拷贝又分为浅拷贝和深拷贝。

>>> s = [1,2,3]>>> sc = copy.copy(s) # 浅拷贝>>> sc[1, 2, 3]
>>> sdc = copy.deepcopy(s) # 深拷贝
>>> sdc
[1, 2, 3]

拷贝出来的对象只是值相同,实为不同的对象

>>> s == sc == sdc 
True
>>> s is sc 
False
>>> s is sdc
False

那么浅拷贝(shallow copy)与深拷贝(deep copy)有什么区别呢?

对于不可变对象,比如整数、字符串、元组、还有由这些不可变对象组成的集合对象,浅拷贝和深拷贝没有区别,都是拷贝一个新对象

两者的区别在于拷贝组合对象,比如列表中还有列表,字典中还有字典或者列表的情况时,浅拷贝只拷贝了外面的壳子,里面的元素并没有拷贝,而深拷贝则是把壳子和里面的元素都拷贝了一份新的。

来看一个例子:

>>> x = [2, 3]
>>> y = [7, 11]
>>> z = [x, y]
>>> a = copy.copy(z) # 浅拷贝
>>> a[0] is z[0]
True

一篇文章读懂Python赋值与拷贝

拷贝出来的对象 a 中的元素引用的是 x 和 y,当你修改 x 的值,a 也会跟着变。

>>> b = copy.deepcopy(z) # 深拷贝
>>> b[0] is z[0]
False

一篇文章读懂Python赋值与拷贝

对于深拷贝,里面的元素也重新拷贝了一份,拷贝了一份与x和y等值的两个元素,修改 x 和 y 的值,不会对 b 产生影响

对列表的切片拷贝z[:]或者是调用对象的copy方法list.copy()都属于浅拷贝。对于自定义对象,我们还可以自己实现__copy__方法和__deepcopy__方法

总结

以上所述是小编给大家介绍的通过一篇文章读懂Python赋值与拷贝,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
解决python3在anaconda下安装caffe失败的问题
Jun 15 Python
python实现遍历文件夹修改文件后缀
Aug 28 Python
修改默认的pip版本为对应python2.7的方法
Nov 06 Python
python处理两种分隔符的数据集方法
Dec 12 Python
python之生产者消费者模型实现详解
Jul 27 Python
python求加权平均值的实例(附纯python写法)
Aug 22 Python
手把手教你Python yLab的绘制折线图的画法
Oct 23 Python
使用Python函数进行模块化的实现
Nov 15 Python
python实现输入的数据在地图上生成热力图效果
Dec 06 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
Jan 29 Python
Python pandas读取CSV文件的注意事项(适合新手)
Jun 20 Python
PyQt5每天必学之布局管理
Apr 19 #Python
PyQt5每天必学之创建窗口居中效果
Apr 19 #Python
PyQt5每天必学之弹出消息框
Apr 19 #Python
详谈python3中用for循环删除列表中元素的坑
Apr 19 #Python
PyQt5每天必学之关闭窗口
Apr 19 #Python
python实现在IDLE中输入多行的方法
Apr 19 #Python
python贪婪匹配以及多行匹配的实例讲解
Apr 19 #Python
You might like
微信扫描二维码登录网站代码示例
2013/12/30 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
前台js调用后台方法示例
2013/12/02 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
2015/06/25 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
2016/04/17 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
2017/09/26 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
2019/09/26 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
基于Django用户认证系统详解
2018/02/21 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
2020/07/30 Python
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
Java基础面试题
2014/07/19 面试题
联谊活动策划书
2014/01/26 职场文书
党的群众路线教育实践活动心得体会900字
2014/03/07 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
给孩子的新年寄语
2014/04/08 职场文书
React中的Context应用场景分析
2021/06/11 Javascript
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js
微前端qiankun改造日渐庞大的项目教程
2022/06/21 Javascript