此文只是对其他文章的搬运,原文链接见下
对象的概念
在Python中,对象的定义是松散的,从感性上可以解释为:Python中一切可以赋值给变量或者作为参数传递给函数
Python的对象都有三个特性
身份:每个对象都有唯一的身份标识自己,可以用id()函数来得到任何对象的身份
类型:对象的类型决定对象可以保存什么类型的值,有哪些属性和方法,可以进行哪些操作,遵循什么样的规则
值:对象表示的数据
如果对象支持更新操作,则它的值是可变的,否则为只读
对象的创建和使用
a = 3
上面的代码创建了一个对象来表示数字3,并且将a和数字3连接,a成为对象3的一个引用。从内部看,变量是到对象的内存空间的一个指针。
可以这么理解:对象是堆上分配的一个内存空间,表示对象代表的值;变量是一个系统创建的表中的元素,拥有指向对象的引用
python会缓存某些不变的对象进行复用,而不是每次都创建新的对象
共享引用
python中变量都是指向某一对象的引用
>>>a = 1
>>>b = a
>>>a = 2
>>>b
1 #变量只是对对象的引用,改变a不会导致b的变化
但是对列表这种可变对象则不同
>a = [1, 2, 3]
>b = a
>a[0] = 0
>a
[0, 2, 3] #这里是直接改变了对象的元素,而不是改变引用
>b
[0, 2, 3] #由于被引用的对象发生了变化,因此b也发生了改变
由于这种可变性,要求对其进行拷贝来保持原来的列表,比如用语句‘b = a[:]’,对于没有分片概念的类型来说,可以使用copy模块中的copy()进行拷贝
对象相等
'=='用于测试俩个被引用的对象值是否相等
'is’用与比较俩个被引用的对象是否为同一个对象
当对象为一个较小的数字或较短的字符时结果又不一样
这是由于python的缓存机制造成的,小的数字和字符被缓存且复用,所以a和b指向同一个对象
对象回收机制
上边提到对象包含一个引用的计数器,计数器记录了当前指向该对象引用的数目,一旦对象的计数器为 0 ,即不存在对该对象的引用,则这个对象的内存空间会被回收。这就是 Python 中对象的回收机制,一个最明显的好处即在编写代码过程中不需要考虑释放内存空间。
可以通过 sys 模块中的 getrefcount() 函数查询一个对象计数器的值