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 字符串定义
Sep 25 Python
python递归查询菜单并转换成json实例
Mar 27 Python
python ddt实现数据驱动
Mar 14 Python
Python使用win32 COM实现Excel的写入与保存功能示例
May 03 Python
django中SMTP发送邮件配置详解
Jul 19 Python
Django框架之中间件MiddleWare的实现
Dec 30 Python
tensorflow对图像进行拼接的例子
Feb 05 Python
python logging设置level失败的解决方法
Feb 19 Python
pandas创建DataFrame的7种方法小结
Jun 14 Python
基于Python实现下载网易音乐代码实例
Aug 10 Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 Python
python计算列表元素与乘积详情
Aug 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
substr()函数中文版
2006/10/09 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
JQuery优缺点分析说明
2010/06/09 Javascript
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
2011/01/17 Javascript
JavaScript中的16进制字符(改进)
2011/11/21 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
2017/04/13 Javascript
ReactNative实现图片上传功能的示例代码
2017/07/11 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
Python操作MongoDB详解及实例
2017/05/18 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
python中bytes和str类型的区别
2019/10/21 Python
基于python中__add__函数的用法
2019/11/25 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
为什么说python适合写爬虫
2020/06/11 Python
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
优秀老师事迹材料
2014/02/05 职场文书
青年文明号口号
2014/06/17 职场文书
关爱残疾人标语
2014/06/25 职场文书
中国梦读书活动总结
2014/07/10 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL
灵能百分百第三季什么时候来?
2022/03/15 日漫