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通过websocket与js客户端通信示例分析
Jun 25 Python
Python的Django框架中if标签的相关使用
Jul 15 Python
python获取代码运行时间的实例代码
Jun 11 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
Oct 17 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
python实现对输入的密文加密
Mar 20 Python
pyqt5 实现在别的窗口弹出进度条
Jun 18 Python
python实现接口并发测试脚本
Jun 25 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
如何基于python操作json文件获取内容
Dec 24 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
Mar 23 Python
python可视化大屏库big_screen示例详解
Nov 23 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
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
js 图片随机不定向浮动的实现代码
2013/07/02 Javascript
各种常用的JS函数整理
2013/10/25 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
jQuery CSS()方法改变现有的CSS样式
2014/08/20 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
2014/10/14 Javascript
JavaScript window.location对象
2014/11/14 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
小程序简单两栏瀑布流效果的实现
2019/12/18 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
Javascript基于OOP实实现探测器功能代码实例
2020/08/26 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
python发腾讯微博代码分享
2014/01/10 Python
django批量导入xml数据
2016/10/16 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
解决Pandas的DataFrame输出截断和省略的问题
2019/02/08 Python
Python 动态导入对象,importlib.import_module()的使用方法
2019/08/28 Python
python Paramiko使用示例
2020/09/21 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
详解pandas映射与数据转换
2021/01/22 Python
旧时光糖果:Old Time Candy
2018/02/05 全球购物
创意爱尔兰礼物:Creative Irish Gifts
2020/01/29 全球购物
应届中专生自荐书范文
2014/02/13 职场文书
2015年调度员工作总结
2015/04/30 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
100句人生哲理语录集锦:强者征服今天,懒汉坐等明天
2019/10/18 职场文书
Django项目如何获得SSL证书与配置HTTPS
2021/04/30 Python
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
DSP接收机前端设想
2022/04/05 无线电
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python