Python从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象。python
Java虽然也是面向对象编程的语言,可是血统没有Python纯正。好比Java的八种基本数据类型之一int,在持久化的时候,就须要包装成Integer类对象。可是在python中,一切皆对象。数字、字符串、元组、列表、字典、函数、方法、类、模块等等都是对象,包括你的代码。编程
对象的概念缓存
究竟何谓对象?不一样的编程语言以不一样的方式定义“对象”。某些语言中,它意味着全部对象必须有属性和方法;另外一些语言中,它意味着全部的对象均可以子类化。编程语言
在Python中,定义是松散的,某些对象既没有属性也没有方法,并且不是全部的对象均可以子类化。可是Python的万物皆对象从感性上能够解释为:Python 中的一切均可以赋值给变量或者做为参数传递给函数。函数
Python 的全部对象都有三个特性:学习
身份:每一个对象都有一个惟一的身份标识本身,任何对象的身份均可以使用内建函数 id() 来获得,能够简单的认为这个值是该对象的内存地址。测试
>>> a = 1
>>> id(a)
>>> 26188904 # 身份由这样一串相似的数字表示
复制代码
类型:对象的类型决定了对象能够保存什么类型的值,有哪些属性和方法,能够进行哪些操做,遵循怎样的规则。可使用内建函数 type() 来查看对象的类型。优化
''' 遇到问题没人解答?小编建立了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴, 互帮互助,群里还有不错的视频学习教程和PDF电子书! '''
>>> type(a)
<type 'int'>
>>> type(type)
<type 'type'> #万物皆对象,type 也是一种特殊的对象 type
复制代码
值:对象所表示的数据spa
>>> a
1
复制代码
"身份"、"类型"和"值"在全部对象建立时被赋值。若是对象支持更新操做,则它的值是可变的,不然为只读(数字、字符串、元组等均不可变)。只要对象还存在,这三个特性就一直存在。设计
对象的属性:大部分 Python 对象有属性、值或方法,使用句点(.)标记法来访问属性。最多见的属性是函数和方法,一些 Python 对象也有数据属性,如:类、模块、文件等
对象的建立和引用
>>> a = 3
复制代码
简单来看,上边的代码执行了如下操做:
建立了一个对象来表明数字 3 若是变量 a 不存在,建立一个新的变量 a 将变量 a 和数字 3 进行链接,即 a 成为对象 3 的一个引用,从内部来看,变量是到对象的内存空间的一个指针,尤为注意:变量老是链接到对象,而不会链接到其余变量。 从概念上能够这样理解,对象是堆上分配的一个内存空间,用来表示对象所表明的值;变量是一个系统建立的表中的元素,拥有指向对象的引用;引用是从变量到对象的指针。
从技术上来讲,每个对象有两个标准的头部信息,一个类型标识符来标识类型,还有一个引用的计数器,用于决定是否须要对对象进行回收。这里还涉及到对象的一种优化方法,Python 缓存了某些不变的对象对其进行复用,而不是每次建立新的对象。
''' 遇到问题没人解答?小编建立了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴, 互帮互助,群里还有不错的视频学习教程和PDF电子书! '''
>>> a = 1
>>> b = 1
>>> id(a)
26188904
>>> id(b)
26188904 # a 和 b 都指向了同一对象
复制代码
共享引用
在 Python 中变量都是指向某一对象的引用,当多个变量都引用了相同的对象,成为共享引用。
>>> a = 1
>>> b = a
>>> a = 2
>>> b
1 # 因为变量仅是对对象的一个引用,所以改变 a 并不会致使 b 的变化
复制代码
但对于像列表这种可变对象来讲则不一样
''' 遇到问题没人解答?小编建立了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴, 互帮互助,群里还有不错的视频学习教程和PDF电子书! '''
>>> 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 用于比较两个被引用的对象是不是同一个对象
''' 遇到问题没人解答?小编建立了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴, 互帮互助,群里还有不错的视频学习教程和PDF电子书! '''
>>> 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
复制代码