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 相关文章推荐
python3读取MySQL-Front的MYSQL密码
May 03 Python
python3.0 模拟用户登录,三次错误锁定的实例
Nov 02 Python
Python DataFrame 设置输出不显示index(索引)值的方法
Jun 07 Python
python画折线图的程序
Jul 26 Python
Python生成一个迭代器的实操方法
Jun 18 Python
如何利用Python模拟GitHub登录详解
Jul 15 Python
详解Python3 pandas.merge用法
Sep 05 Python
python实现局域网内实时通信代码
Dec 22 Python
关于Keras Dense层整理
May 21 Python
用Python开发app后端有优势吗
Jun 29 Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 Python
Python中的datetime包与time包包和模块详情
Feb 28 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
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
复制js对象方法(详解)
2013/07/08 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
Kindeditor单独调用多图上传实例
2017/07/31 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
webpack3.0升级4.0的方法步骤
2020/04/02 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
python使用socket进行简单网络连接的方法
2015/04/29 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
便捷提取python导入包的属性方法
2018/10/15 Python
Python基于yield遍历多个可迭代对象
2020/03/12 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
英国创新设计文具、卡片和礼品包装网站:Paperchase
2018/07/14 全球购物
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
销售代表求职自荐信
2013/10/01 职场文书
酒店保安员岗位职责
2014/01/31 职场文书
产品质量承诺范本
2014/03/31 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
租车协议书范本2014
2014/11/17 职场文书
网络管理员岗位职责
2015/02/12 职场文书
廉洁自律证明
2015/06/24 职场文书
推广普通话的宣传语
2015/07/13 职场文书
Python+Appium实现自动抢微信红包
2021/05/21 Python
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android