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获取CPU和内存信息的思路与实现(linux系统)
Jan 03 Python
Python创建系统目录的方法
Mar 11 Python
python中列表元素连接方法join用法实例
Apr 07 Python
浅谈function(函数)中的动态参数
Apr 30 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
用Python读取几十万行文本数据
Dec 24 Python
Python 函数返回值的示例代码
Mar 11 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
python解析xml简单示例
Jun 21 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
Python Pandas 对列/行进行选择,增加,删除操作
May 17 Python
运行Python编写的程序方法实例
Oct 21 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 UBB 解析实现代码
2011/11/27 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
php生成无限栏目树
2017/03/16 PHP
php+js实现裁剪任意形状图片
2018/10/31 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
ExtJS 入门
2010/10/29 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
JavaScript将XML转成JSON的方法
2015/03/12 Javascript
javascript实现信息增删改查的方法
2015/07/25 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
python实现探测socket和web服务示例
2014/03/28 Python
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
Python爬虫DOTA排行榜爬取实例(分享)
2017/06/13 Python
机器学习python实战之决策树
2017/11/01 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
python实现拼接图片
2020/03/23 Python
OpenCV利用python来实现图像的直方图均衡化
2020/10/21 Python
食堂个人先进事迹
2014/01/22 职场文书
入学申请自荐信范文
2014/02/26 职场文书
电视购物广告词
2014/03/19 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
建设办主任四风问题整改思路和措施
2014/09/20 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
行政复议决定书
2015/06/24 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS
js作用域及作用域链工作引擎
2022/07/07 Javascript