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代码检查工具pylint 让你的python更规范
Sep 05 Python
python中enumerate的用法实例解析
Aug 18 Python
Python实现的数据结构与算法之链表详解
Apr 22 Python
利用Python爬虫给孩子起个好名字
Feb 14 Python
Python进阶之尾递归的用法实例
Jan 31 Python
VScode编写第一个Python程序HelloWorld步骤
Apr 06 Python
Python简单实现的代理服务器端口映射功能示例
Apr 08 Python
基于DATAFRAME中元素的读取与修改方法
Jun 08 Python
Python处理时间日期坐标轴过程详解
Jun 25 Python
jupyter 实现notebook中显示完整的行和列
Apr 09 Python
Python-OpenCV教程之图像的位运算详解
Jun 21 Python
Python 处理表格进行成绩排序的操作代码
Jul 26 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
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
如何使用Strace调试工具
2013/06/03 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
JavaScript采用递归算法计算阶乘实例
2015/08/04 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
vue路由插件之vue-route
2019/06/13 Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
2019/08/20 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
德国珠宝和配件商店:Styleserver
2021/02/23 全球购物
傲盾软件面试题
2015/08/17 面试题
初三班主任寄语大全
2014/04/04 职场文书
中学生操行评语大全
2014/04/24 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
大学军训决心书
2015/02/05 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
Python利用capstone实现反汇编
2022/04/06 Python