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 数组的切片操作详解
Jul 02 Python
python单例模式实例解析
Aug 28 Python
Python Selenium 之关闭窗口close与quit的方法
Feb 13 Python
python实现银联支付和支付宝支付接入
May 07 Python
PyCharm中代码字体大小调整方法
Jul 29 Python
PyTorch中Tensor的拼接与拆分的实现
Aug 18 Python
Python3进制之间的转换代码实例
Aug 24 Python
python实现图片插入文字
Nov 26 Python
Python3实现将一维数组按标准长度分隔为二维数组
Nov 29 Python
使用Python实现牛顿法求极值
Feb 10 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 Python
python3获取控制台输入的数据的具体实例
Aug 16 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
Oracle 常见问题解答
2006/10/09 PHP
PHP获取url的函数代码
2011/08/02 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
PHP加密解密类实例代码
2016/07/20 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
js数组中如何随机取出一个值
2014/06/13 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
JSON 数据格式详解
2017/09/13 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
python获取mp3文件信息的方法
2015/06/15 Python
python实现多进程代码示例
2018/10/31 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
python groupby 函数 as_index详解
2019/12/16 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
西班牙在线宠物商店:zooplus.es
2017/02/24 全球购物
预备党员承诺书
2014/03/25 职场文书
亲子阅读的活动方案
2014/08/15 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python
go开发alertmanger实现钉钉报警
2021/07/16 Golang