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 BeautifulSoup库抓取58手机维修信息
Nov 21 Python
Python 编码Basic Auth使用方法简单实例
May 25 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
Python数据集切分实例
Dec 08 Python
Python中xml和dict格式转换的示例代码
Nov 07 Python
Tensorflow 卷积的梯度反向传播过程
Feb 10 Python
python 通过邮件控制实现远程控制电脑操作
Mar 16 Python
selenium+python配置chrome浏览器的选项的实现
Mar 18 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
Mar 24 Python
python能否java成为主流语言吗
Jun 22 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 Python
Python  序列化反序列化和异常处理的问题小结
Dec 24 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强制下载类型的实现代码
2011/04/21 PHP
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
php生成数字字母的验证码图片
2015/07/14 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
jquery 查找新建元素代码
2010/07/06 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
Node.js巧妙实现Web应用代码热更新
2015/10/22 Javascript
详解JavaScript的流程控制语句
2015/11/30 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
详解react-router如何实现按需加载
2017/06/15 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
[05:48]DOTA2英雄梦之声vol21 屠夫
2014/06/20 DOTA
python 2.7.14安装图文教程
2018/04/08 Python
python实现从wind导入数据
2019/12/03 Python
Python包,__init__.py功能与用法分析
2020/01/07 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
Html5写一个简单的俄罗斯方块小游戏
2019/12/03 HTML / CSS
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
Java如何格式化日期
2012/08/07 面试题
工程部经理岗位职责
2013/12/08 职场文书
班级体育活动总结
2014/07/05 职场文书
民主评议党员自我评价材料
2014/09/18 职场文书
导游词之扬州大明寺
2019/10/09 职场文书
Django rest framework如何自定义用户表
2021/06/09 Python
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android
全面盘点MySQL中的那些重要日志文件
2021/11/27 MySQL
Linux安装Docker详细教程
2022/07/07 Servers
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技