美文网首页Python
1. 万物皆对象

1. 万物皆对象

作者: 梦回吹角连营 | 来源:发表于2014-12-10 20:15 被阅读1954次

在 Python 中有一个重要的概念,即 万物皆对象 —— 数字、字符串、元组、列表、字典等所有内置数据类型函数方法模块,在 Python 中所有的一切都是对象。

对象的概念

对象的概念在直观上表现为:Python 中的一切都可以赋值给变量或者作为参数传递给函数。从机制上来看,Python 使用对象模型来存储数据,构造任何类型的值都是一个对象。

所有 Python 的对象都有三个特性:

  • 身份:每个对象都有一个唯一的身份标识自己,任何对象的身份都可以使用内建函数 id() 来得到,可以简单的认为这个值是该对象的内存地址。
>>> a = 1
>>> id(a)
>>> 26188904                        # 身份由这样一串类似的数字表示
  • 类型:对象的类型决定了对象可以保存什么类型的值,有哪些属性和方法,可以进行哪些操作,遵循怎样的规则。可以使用内建函数 type() 来查看对象的类型。
>>> type(a)
<type 'int'>
>>> type(type)
<type 'type'>                         #万物皆对象,type 也是一种特殊的对象 type
  • 值:对象所表示的数据
>>> a
1

身份 类型 在所有对象创建时被赋值。如果对象支持更新操作,则它的值是可变的,否则为只读(数字、字符串、元组等均不可变)。只要对象还存在,这三个特性就一直存在。

对象的属性:大部分 Python 对象有属性、值或方法,使用句点(.)标记法来访问属性。最常见的属性是函数和方法,一些 Python 对象也有数据属性,如:类、模块、文件等

对象的创建和引用

>>> a = 1

简单来看,上边的代码执行了以下操作:

  • 创建了一个对象来代表数字 3

  • 如果变量 a 不存在,创建一个新的变量 a

  • 将变量 a 和数字 3 进行连接,即 a 成为对象 3 的一个引用,从内部来看,变量是到对象的内存空间的一个指针,尤其注意:变量总是连接到对象,而不会连接到其他变量。

从概念上可以这样理解,对象是分配的一个内存空间,用来表示对象所代表的值;变量是一个系统创建的表中的元素,拥有指向对象的引用;引用是从变量到对象的指针。

从技术上来说,每一个对象有两个标准的头部信息,一个类型标识符来标识类型,还有一个引用的计数器,用于决定是否需要对对象进行回收。这里还涉及到对象的一种优化方法,Python 缓存了某些不变的对象对其进行复用,而不是每次创建新的对象。

>>> a = 1
>>> b = 1
>>> id(a)
26188904
>>> id(b)
26188904                                             # a 和 b 都指向了同一对象

共享引用

在 Python 中变量都是指向某一对象的引用,当多个变量都引用了相同的对象,成为共享引用。

>>> a = 1
>>> b = a
>>> a = 2
>>> b
1                       # 由于变量仅是对对象的一个引用,因此改变 a 并不会导致 b 的变化

但对于像列表这种可变对象来说则不同

>>> a = [1, 2, 3]
>>> b = a
>>> a[0] = 0
>>> a
[0, 2, 3]            # 这里并没有改变 a 的引用,而是改变了被引用对象的某个元素
>>> b
[0, 2, 3]            # 由于被引用对象发生了变化,因此 b 对应的值也发生了改变

由于列表的这种可变性,在代码执行某些操作时可能出现一些意外,因此需要对其进行拷贝来保持原来的列表

>>> a = [1, 2, 3]
>>> b = a[:]
>>> id(a)
140200275166560
>>> id(b)
140200275238712             # 由于 b 引用的是 a 引用对象的一个拷贝,两个变量指向的内存空间不同
>>> a[0] = 0
>>> b
[1, 2, 3]                   # 改变 a 中的元素并不会引起 b 的变化

对于字典和集合等没有分片概念的类型来说,可以使用 copy 模块中的 copy() 方法进行拷贝

>>> import copy
>>> b = copy.copy(a)

相等

== 操作符用于测试两个被引用的对象的值是否相等
is 用于比较两个被引用的对象是否是同一个对象

>>> a = [1, 2, 3]
>>> b = a
>>> a is b
True               # a 和 b 指向相同的对象
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a is b
False               # a 和 b 指向不同的对象

当操作对象为一个较小的数字或较短的字符串时,又有不同:

>>> a = 7
>>> b = 7
>>> a is b
True               # a 和 b 指向相同的对象

这是由于 Python 的缓存机制造成的,小的数字和字符串被缓存并复用,所以 a 和 b 指向同一个对象

对象的回收机制

上边提到对象包含一个引用的计数器,计数器记录了当前指向该对象引用的数目,一旦对象的计数器为 0 ,即不存在对该对象的引用,则这个对象的内存空间会被回收。这就是 Python 中对象的回收机制,一个最明显的好处即在编写代码过程中不需要考虑释放内存空间。

可以通过 sys 模块中的 getrefcount() 函数查询一个对象计数器的值

>>> import sys
>>> sys.getrefcount(1)
718

相关文章

  • 万物皆对象目录

    万物皆对象(1) 万物皆对象(2) 万物皆对象(3) 万物皆对象(4)

  • 1. 万物皆对象

    在 Python 中有一个重要的概念,即 万物皆对象 —— 数字、字符串、元组、列表、字典等所有内置数据类型, 函...

  • Python 中 is 和 == 的区别

    Python 中,万物皆对象!万物皆对象!万物皆对象!(很重要,重复 3 遍) 要理解 Python 中 is 和...

  • js构造函数和属性

    1.四种构造函数方式创建对象 2.万物皆属性、万物皆对象 3.set、get 使用方法 4.权限writable设...

  • prototype和__proto_

    1.在JS里,万物皆对象。方法(Function)是对象,方法的原型(Function.prototype)是对象...

  • proto

    1.在JS里,万物皆对象。方法(Function)是对象,方法的原型(Function.prototype)是对象...

  • python对象和垃圾回收

    1. python对象 python使用对象模型来存储数据,python中万物皆对象。python对象有三个特性:...

  • java "万物皆对象?"---"万物皆对象!"

    还记得最初写游戏(打砖块)的时候,对java万物皆对象的理解: 当时的游戏有Ball类,Brick类...

  • 原型和原型链 - 草稿

    一 . 原型 js中万物皆对象,(普通对象和函数对象) Object.function是js自带的函数对象 1.举...

  • java基础-day18-反射

    反射 1. 反射 1.1 昨日回顾 1.2 万物皆对象 1.3 Class类型获取 1.4 通过Class对象获取...

网友评论

    本文标题:1. 万物皆对象

    本文链接:https://www.haomeiwen.com/subject/hruntttx.html