《The Python Data Model, Explained》Posted by Al Sweigart in python - 中译版

对 Python 数据模型的解释(The Python Data Model, Explained)

由 Al Sweigart 发布
      Python数据模型是Python官方文档中的一个文档,它描述了Python语言的数据概念,与其他语言如何处理数据的方式不同。它充满了抽象的想法,对于新的软件开发人员来说通常难以理解。 (或者甚至是经验丰富的开发人员;尽管多年来编写Python代码,但我从中学到了很多新东西。)
      这篇博客文章旨在将Python数据模型中的复杂想法降低到更易理解的水平。你可能会首先从PyCon 2015上看到NedBatchder的 Facts and Myths about Python Names and Value,尽管这并不是严格要求的。这篇博文可能有差距;我写这篇文章主要是为了了解本文档中的内容。
      这篇博客文章遵循与Python数据模型(官方Python文档中的第3部分)相同的标题,因此您可以打开 Python官方文档的数据模型 并大致并排阅读它们将其视为“Python数据模型文档,但使用代码示例”。
      如果您想了解有关Python数据模型的另一个可读资源,请查看Fluent Python的第1章。打开Amazon链接吧。

3.1.对象,值和类型(Objects, values and types)

      Python中的所有东西都是对象。 “原始类型【primitive types】”(int,float,bool)与Python中的“对象类型”(字符串【strings】,日期对象【data objects】,复杂数据结构【 complex data structures】)之间没有区别,就像在Java中一样。 甚至函数和代码都存储为对象。
所有Python对象都具有标识(identity),类型(type)和值(value)。
标识是一个独一无二的整数,在对象的生命周期内永远不会改变,您可以使用id()函数(代码可视化)找到它:

>>> spam = 42
>>> id(spam)
140711779350640
>>> cheese = 'hello'
>>> id(cheese)
1725534351520

在CPython(从https://python.org下载的Python解释器,而不是PyPy或Jython),标识是对象的内存地址。
对象的类型(例如整数,浮点数,字符串等)也是不变的。 您可以通过将对象传递给type()(代码可视化)来查看对象的类型:

>>> spam = 42
>>> type(spam)
<class 'int'>
>>> cheese = 'hello'
>>> type(cheese)
<class 'str'>
>>> type(type(cheese)) #甚至从type()返回的对象也有一个类型:它是type类型。 
<class 'type'>

值对Python程序员来说更加直观:42是整数值,'hello’是字符串值,依此类推。 对象的值可以是可更改的(即,可变的【Mutable】),也可以是不可更改的(即,不可变的【Immutable】)。
最好将Python变量视为附加到对象的标签,而不是对象存在里面的盒子。可以将多个变量附加到同一个对象,如众所周知的Python陷阱所示,其中两个变量引用相同的列表( 代码可视化):

>>> spam = [2, 4, 6, 8]
>>> cheese = spam # 复制对列表对象的引用,而不是列表对象本身。
>>> cheese
[2, 4, 6, 8]
>>> spam[0] = 'changed'
>>> spam
['changed', 4, 6, 8]
>>> cheese # 两个变量都已更改,因为它们引用相同的列表对象。
['changed', 4, 6, 8]

      这很重要,因为虽然Python变量被认为是动态且可变的,但通常只是更改变量引用的对象,而底层对象是不可变的。 例如,Python整数是不可变的。 此代码不会更改整数对象,只是将变量指向新对象:

>>> id(spam) # 值为42的整数对象的id为140711779350640。
140711779350640
>>> spam = 43 # 这不是“改变”整数对象,而是将spam指向另一个对象
>>> id(spam) # 这个不同的对象具有与42对象不同的身份
140711779350672

      整数,浮点数,字符串,元组都是不可变类型。 列表,词典和集合是可变的。 注意使用append()方法改变列表值和更改变量引用的列表之间的区别(代码可视化

>>> spam = [2, 4, 6, 8]
>>> id(spam) # 请注意spam引用的列表对象的id
1725535036232
>>> spam.append(10)
>>> spam
[2, 4, 6, 8, 10]
>>> id(spam) # id与以前相同。
1725535036232
>>> spam = [2, 4, 6, 8, 10, 12] # 这是创建一个新的列表对象并让spam引用到它
>>> id(spam) # 您可以分辨出来,因为id是不同的;这是一个不同的列表对象。
1725534094088

      Python代码永远不会明确地销毁对象。 (与C编程语言不同,您可以在其中调用free()来释放对象的内存。)相反,当对象不再有任何引用它的变量时,垃圾收集器会自动销毁Python对象。 这可能在最后一个变量停止引用对象之后不久或很长时间内就会发生这种情况,所以不要编写依赖于对象无法访问时立即销毁的代码。
      包含对其他对象的引用的对象称为容器。 列表,元组,字典和集合是容器类型的例子。

3.2.标准类型层次结构

Python语言
 
【PS.可能作者没写完,或者结束了】

作者:Al Sweigart
以上内容,自己翻译,可能有误,可参考:《The Python Data Model, Explained》

点我回顶部

 
 
 
 
 
 
 
Fin.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值