Python可变对象与不可变对象原理解析


Posted in Python onFebruary 25, 2020

一、原理

  • 可变对象:list dict set
  • 不可变对象:tuple string int float bool

1. python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象的引用,就不能直接修改原始对象——相当于通过“传值'来传递对象。

2. 当人们复制可变对象时,就复制了可变对象的引用,如果改变引用的值,则修改了原始的参数。

3. 为了简化内存管理,Python通过引用计数机制实现自动垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象。

二、具体应用

1. = 与 copy 与 deepcopy

= 赋值并不会新建对象,b 和 a 引用的是同一个对象。

copy 方法会新建对象,b 和 a 引用的是不同的对象,但里面的可变对象(列表 y)依然引用的是同一个对象。也就是说 copy 方法只会复制最外面一层,里面的不会新建对象而是直接用原对象,是浅层复制。

deepcopy 方法会新建对象,里面的可变对象也会新建对象。实际上deepcopy是递归copy,是深层复制。

代码实例

# = 赋值
a = {'x': 11, 'y': [22, 33]}
b = a
print(id(a))
>>> 1630605400840
print(id(b))
>>> 1630605400840

# copy 方法
a = {'x': 11, 'y': [22, 33]}
b = a.copy()
print(id(a))
>>> 2357161715536
print(id(b))
>>> 2357161715608
print(id(a['y']))
>>> 140720772330640
print(id(b['y']))
>>> 140720772330640

# deepcopy 方法
import copy
a = {'x': 11, 'y': [22, 33]}
b = copy.deepcopy(a)
print(id(a))
>>> 2357161715536
print(id(b))
>>> 2357161715608
print(id(a['x']))
>>> 140720772330640
print(id(b['x']))
>>> 140720772330640
print(id(a['y']))
>>> 2462852627784
print(id(b['y']))
>>> 2462852628232

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
比较详细Python正则表达式操作指南(re使用)
Sep 06 Python
Python获取Linux系统下的本机IP地址代码分享
Nov 07 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
Dec 24 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
Apr 09 Python
详解python eval函数的妙用
Nov 16 Python
python2.7实现爬虫网页数据
May 25 Python
Python实现爬取马云的微博功能示例
Feb 16 Python
Python 找出出现次数超过数组长度一半的元素实例
May 11 Python
Python如何使用队列方式实现多线程爬虫
May 12 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
Sep 24 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 Python
Python采集股票数据并制作可视化柱状图
Apr 04 Python
Python 使用 environs 库定义环境变量的方法
Feb 25 #Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 #Python
python用pip install时安装失败的一系列问题及解决方法
Feb 24 #Python
python numpy--数组的组合和分割实例
Feb 24 #Python
python梯度下降算法的实现
Feb 24 #Python
利用python实现逐步回归
Feb 24 #Python
python数据分析:关键字提取方式
Feb 24 #Python
You might like
PHP脚本的10个技巧(1)
2006/10/09 PHP
PHP以及MYSQL日期比较方法
2012/11/29 PHP
php实现获取文章内容第一张图片的方法
2014/11/04 PHP
php使用memcoder将视频转成mp4格式的方法
2015/03/12 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
javascript异步编程的4种方法
2014/02/19 Javascript
js闭包实例汇总
2014/11/09 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
微信小程序page的生命周期和音频播放及监听实例详解
2017/04/07 Javascript
实现图片首尾平滑轮播(JS原生方法—节流)
2017/10/17 Javascript
vue组件watch属性实例讲解
2017/11/07 Javascript
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
[02:36]DOTA2混沌骑士 英雄基础教程
2013/11/26 DOTA
python实现合并两个数组的方法
2015/05/16 Python
Python中防止sql注入的方法详解
2017/02/25 Python
python保存文件方法小结
2018/07/27 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
python3.7环境下安装Anaconda的教程图解
2019/09/10 Python
python实现猜数字游戏
2020/03/25 Python
Python如何在main中调用函数内的函数方式
2020/06/01 Python
IE10 Error.stack 让脚本调试更加方便快捷
2013/04/22 HTML / CSS
南非领先的在线旅行社:Travelstart南非
2016/09/04 全球购物
工作中个人的自我评价
2013/12/31 职场文书
经理岗位职责范本
2015/04/15 职场文书