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字符串替换示例
Apr 24 Python
Python与shell的3种交互方式介绍
Apr 11 Python
Python使用Pycrypto库进行RSA加密的方法详解
Jun 06 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
python3解析库pyquery的深入讲解
Jun 26 Python
python3实现爬取淘宝美食代码分享
Sep 23 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
Python向excel中写入数据的方法
May 05 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
Jun 19 Python
python3.7 openpyxl 删除指定一列或者一行的代码
Oct 08 Python
tensorflow常用函数API介绍
Apr 19 Python
python同时遍历两个list用法说明
May 02 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
农民C键的运用技巧
2020/03/04 星际争霸
PHP 5.0对象模型深度探索之绑定
2006/09/05 PHP
怎样在UNIX系统下安装php3
2006/10/09 PHP
简单实用的.net DataTable导出Execl
2013/10/28 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
Linux下PHP安装mcrypt扩展模块笔记
2014/09/10 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
js带前后翻页的图片切换效果代码分享
2015/09/08 Javascript
JS实现设置ff与ie元素绝对位置的方法
2016/03/08 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
2016/09/14 Javascript
原生js实现可爱糖果数字时间特效
2016/12/30 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
python函数返回多个值的示例方法
2013/12/04 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
python groupby 函数 as_index详解
2019/12/16 Python
python实现控制台输出彩色字体
2020/04/05 Python
Python实现Keras搭建神经网络训练分类模型教程
2020/06/12 Python
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
竞选班长演讲稿
2013/12/30 职场文书
学生会主席演讲稿
2014/04/25 职场文书
工地安全标语
2014/06/07 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
董事长助理岗位职责
2015/02/11 职场文书
2015年庆祝国庆节66周年演讲稿
2015/07/30 职场文书
教师听课学习心得体会
2016/01/15 职场文书
五年级语文教学反思
2016/03/03 职场文书