Python数据模型与Python对象模型的相关总结


Posted in Python onJanuary 26, 2021

数据模型==对象模型

Python官方文档说法是“Python数据模型”,大多数Python书籍作者说法是“Python对象模型”,它们是一个意思,表示“计算机编程语言中对象的属性”。这句话有点抽象,只要知道对象是Python对数据的抽象,在Python中万物皆对象就可以了。

官方文档严谨说法,Python程序中的所有数据都是用对象或对象之间的关系来表示的。

对象三要素

对象有三个要素:编号(identity)、类型(type)、值(value)。

identity

编号就是对象的内存地址,从创建后就不会改变。is运算符用来比较2个对象的编号。id()函数返回对象编号的整数表示。

identity也可以翻译为身份,对象身份。

type

类型决定了可以对对象做哪些操作,也定义了对象的可能值,比如intbool类型的值就不一样。type()函数返回对象类型。很多人会误以为Python是弱类型语言,其实Python是强类型语言,这个误解的真实原因是,Python不需要编译,不需要提前知道变量的类型,在运行时才检查类型,这应该叫做动态语言。

JavaScript是弱类型语言,在Python中1+"2"会运行失败,在JavaScript中能运行成功。

类型在创建后也不会改变,虽然可以进行类型转换,但转换实际会产生新对象:

a = 1
print(id(a))
print(id(str(a)))
print(id(a))

结果为:

140715000207008
2136059506160
140715000207008

value

对象三要素中唯一能改变的就只有值了。官网有一句正确的废话:允许改变值的对象是mutable(可变的),不允许改变值的对象是immutable(不可变的)。它的意义在于当不可变对象的值是对可变对象的引用时,该如何判断对象的可变性?结论是不可变对象仍然是不可变的,因为这个引用是不能变的,但是我们通常会认为这个不可变对象的值是可变的,尤其是对象容器。对象类型也会决定是否可变,比如numbersstringstuples是不可变的,dictionarieslists是可变的。

对象容器

有些对象包含了对其他对象的引用,这叫做containers对象容器,比如tupleslistsdictionaries。大多数情况下,我们说容器的值,说的是引用的对象的值,而不是引用编号。但讨论容器可变性时,则仅仅是指容器直接包含的引用编号。比如tuple是不可变的,如果它包含了对一个可变对象的引用后,当该可变对象改变时容器的值也会改变。

对象回收

对象不会被显式销毁,但是它们会被当做垃圾回收,只要不存在对象引用,这就是Python垃圾回收机制!垃圾回收机制比较复杂,比如循环引用,实际上已经没有使用了,但是还存在引用等,涉及到算法规则,等写完Python进阶,在写Python原理时做进一步研究。

Python垃圾回收机制不是银弹,不能解决所有问题,所以在引用外部资源,比如打开文件后,我们需要注意显式close,防止资源始终占用内存,无法释放,造成内存泄漏。close除了手动调用close()方法外,也可以使用with来自动close。

使用try...except可能会让对象继续存活。

类型决定一切

对象的类型几乎决定了对象的一切行为,甚至是对象编号,比如对于不可变类型:

a = 1
b = 1

a和b可能会指向同一个值为1的对象,也可能会指向两个不同的值为1的对象,这取决于具体实现。

但是对于可变类型:

c = []
d = []

c和d一定会指向两个不同的单独的空列表。

注意c = d = [] 则是将同一个对象赋值给 c 和 d。

小结

Python数据模型就是常说的对象模型,万物皆对象,有编号、类型、值三个要素。了解了对象模型后,Python另一个重要概念即将浮出水面,它就是数据结构。

参考资料:

https://docs.python.org/3/reference/datamodel.html

以上就是Python数据模型与Python对象模型的相关总结的详细内容,更多关于python数据模型与对象模型的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python 爬虫学习笔记之正则表达式
Sep 21 Python
python模拟事件触发机制详解
Jan 19 Python
Python3基于sax解析xml操作示例
May 22 Python
Django+Ajax+jQuery实现网页动态更新的实例
May 28 Python
python爬取网页转换为PDF文件
Jun 07 Python
python画一个玫瑰和一个爱心
Aug 18 Python
python仿evething的文件搜索器实例代码
May 13 Python
简单了解python高阶函数map/reduce
Jun 28 Python
python实现中文文本分句的例子
Jul 15 Python
将python安装信息加入注册表的示例
Nov 20 Python
Python3中的tuple函数知识点讲解
Jan 03 Python
一文搞懂Python Sklearn库使用
Aug 23 Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 #Python
详解用selenium来下载小姐姐图片并保存
Jan 26 #Python
selenium与xpath之获取指定位置的元素的实现
Jan 26 #Python
详解Python中的Lock和Rlock
Jan 26 #Python
5分钟快速掌握Python定时任务框架的实现
Jan 26 #Python
Python爬虫自动化爬取b站实时弹幕实例方法
Jan 26 #Python
python 实现的车牌识别项目
Jan 25 #Python
You might like
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
javascript 获取iframe里页面中元素值的方法
2014/02/17 Javascript
Javascript检查图片大小不要让大图片撑破页面
2014/11/04 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
Layui给switch添加响应事件的例子
2019/09/03 Javascript
详解Vue之计算属性
2020/06/20 Javascript
Openlayers实现地图的基本操作
2020/09/28 Javascript
[00:35]DOTA2上海特级锦标赛 EG战队宣传片
2016/03/04 DOTA
Python获取linux主机ip的简单实现方法
2016/04/18 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
Python编程之string相关操作实例详解
2017/07/22 Python
python判断字符串是否是json格式方法分享
2017/11/07 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
python装饰器使用实例详解
2019/12/14 Python
Python实现搜索算法的实例代码
2020/01/02 Python
pytorch forward两个参数实例
2020/01/17 Python
django和flask哪个值得研究学习
2020/07/31 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
《雨点》教学反思
2014/02/12 职场文书
材料物理专业求职信
2014/09/01 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
2014年会计个人工作总结
2014/11/24 职场文书
大学生个人年度总结范文
2015/02/15 职场文书
2015年党员发展工作总结
2015/05/13 职场文书
2015迎新晚会开场白
2015/05/29 职场文书
小孩不笨观后感
2015/06/03 职场文书
pyqt5打包成exe可执行文件的方法
2021/05/14 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis