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 编码处理-str与Unicode的区别
Sep 06 Python
Python实现DDos攻击实例详解
Feb 02 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
keras获得某一层或者某层权重的输出实例
Jan 24 Python
关于多元线性回归分析——Python&SPSS
Feb 24 Python
python实现从ftp服务器下载文件
Mar 03 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
Mar 06 Python
快速解决jupyter notebook启动需要密码的问题
Apr 21 Python
django 连接数据库出现1045错误的解决方式
May 14 Python
python 基于opencv 绘制图像轮廓
Dec 11 Python
使用pandas模块实现数据的标准化操作
May 14 Python
Python四款GUI图形界面库介绍
Jun 05 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
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
jquery text()要注意啦
2009/10/30 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
50个比较实用jQuery代码段
2011/09/18 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
Js+Ajax,Get和Post在使用上的区别小结
2016/06/08 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
jQuery动态改变多行文本框高度的方法
2016/09/07 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
JavaScript评论点赞功能的实现方法
2017/03/13 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
2017/04/13 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
2020/07/07 Javascript
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
python实现解数独程序代码
2017/04/12 Python
Python 私有函数的实例详解
2017/09/11 Python
python中的计时器timeit的使用方法
2017/10/20 Python
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Python中的整除和取模实例
2020/06/03 Python
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
三星法国官方网站:Samsung法国
2019/10/31 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
Java的五个基础面试题
2016/02/26 面试题
户籍证明书标准模板
2014/09/10 职场文书
服务承诺书
2015/01/19 职场文书
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
MySQL如何使备份得数据保持一致
2022/05/02 MySQL