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 multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 Python
python多线程用法实例详解
Jan 15 Python
Python中的pprint折腾记
Jan 21 Python
利用Python实现简单的相似图片搜索的教程
Apr 23 Python
python计算方程式根的方法
May 07 Python
python利用标准库如何获取本地IP示例详解
Nov 01 Python
Python 微信之获取好友昵称并制作wordcloud的实例
Feb 21 Python
python定时检测无响应进程并重启的实例代码
Apr 22 Python
python读写csv文件的方法
Aug 13 Python
python编写微信公众号首图思路详解
Dec 13 Python
pytorch:实现简单的GAN示例(MNIST数据集)
Jan 10 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
Sep 01 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获取数组长度的方法(有实例)
2013/10/27 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
JavaScript常用对象的方法和属性小结
2012/01/24 Javascript
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
jQuery实现键盘回车搜索功能
2017/07/25 jQuery
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
详解vue中使用protobuf踩坑记
2019/05/07 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
Python访问MySQL封装的常用类实例
2014/11/11 Python
Python 处理数据的实例详解
2017/08/10 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
python中的数据结构比较
2019/05/13 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
白宫黑市官网:White House Black Market
2016/11/17 全球购物
意大利火车票和铁路通行证专家:ItaliaRail
2019/01/22 全球购物
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
中英文求职信范文
2014/01/27 职场文书
管理失职检讨书
2014/02/12 职场文书
感恩节活动策划方案
2014/05/16 职场文书
妇联主席先进事迹
2014/05/18 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
python 逐步回归算法
2021/04/06 Python
python用海龟绘图写贪吃蛇游戏
2021/06/18 Python
MySQL数据库事务的四大特性
2022/04/20 MySQL