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中使用pprint函数进行格式化输出的教程
Apr 07 Python
Django学习笔记之ORM基础教程
Mar 27 Python
Numpy 将二维图像矩阵转换为一维向量的方法
Jun 05 Python
使用anaconda的pip安装第三方python包的操作步骤
Jun 11 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
python实现键盘输入的实操方法
Jul 16 Python
Python之指数与E记法的区别详解
Nov 21 Python
python 初始化一个定长的数组实例
Dec 02 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
Apr 22 Python
Pytorch实现将模型的所有参数的梯度清0
Jun 24 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
Sep 16 Python
Python 带星号(* 或 **)的函数参数详解
Feb 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
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
2017/01/20 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
JavaScript验证电子邮箱的函数
2014/08/22 Javascript
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
three.js 入门案例详解
2018/01/23 Javascript
小程序云开发实现数据库异步操作同步化
2019/05/18 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
捷科时代的软件测试笔试题
2015/11/09 面试题
《月球之谜》教学反思
2014/04/10 职场文书
目标管理责任书
2014/04/15 职场文书
食品流通安全承诺书
2014/05/22 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
财务出纳岗位职责
2015/03/31 职场文书
欠条样本
2015/07/03 职场文书
2016情人节宣传语
2015/07/14 职场文书