在Python中,一切数据都是对象,或者和对象有关.(代码也可以看作是对象).
每个对象都有一个标识,一个类型,一个值.标识我们可以理解成内存地址.对象一建立,标识就不能变了."is"用来比较两个对象的标识,id()这个函数取对象标识-一个整数,其实就是内存地址.
对象的类型也不能变,用来检测对象支持的操作.同时也定义的此种类型的对象的可能的值.type()这个函数返回对象的类型,(类型本身也是一个对象).
对象的值有可变的和不可变的两种,也就有了可变对象和不可变对象两种.英文分别是mutable和immutable, 对象不可变(immutable)和值不可变(unchangeable value)是不同的. 这个比较绕,看原文比较好理解,原文是(The value of an immutable container object that contains a reference to a mutable object can change when the latter's value is changed; however the container is still considered immutable, because the collection of objects it contains cannot be changed. So, immutability is not strictly the same as having an unchangeable value, it is more subtle.).或者这么说,包容器(container)是不可变对象,假设它包含了可变的对象引用,那么当它包含的对象的值变化的时候,包容器的值也变化了,但是这个时候,我们说包容器仍然是不可变的,因为它所包含的对象集合是不可变的.对象的可变性是由它的类型所决定的.比如,数值,字符串和元组是不可变的,但是字典和列表是可变的.
Python和Java一样,有垃圾回收机制.对于Python的垃圾回收,我们需要注意下面的情况.在Python库参考里面有循环回收的详细控制情况.在使用了跟踪和调试工具时,一些本来应该回收的对象可能没有被回收,另外在"try...except"语句里面也有这种情况.
另外,对于一些包含了"外部"资源的对象,比如文件和窗口,最好用"try...finally"来显示的释放这些资源.一般是close()这个方法.
下面我们来看一下容器(containers),这种对象包含了其他对象的引用.比如,元组,列表和字典.大部分情况,当我们说容器的值的时候就是指这个指本身(对象的引用也是值的一部分),而不是包含的对象.当我们讨论容器对象的可变性的时候,就只是说被包含对象的标识了.因此,如果一个不可变对象(如元组)包含了一个可变对象, 那么只要这个可变对象的值变了则它的值就也改变了.
对于对象的类型,它对对象的行为有很大的影响,甚至对对象的标识也有影响.对于不可变对象(immutable),计算新值的运算符可能实际上返回的是一个已经存在的,具有相同类型和值的对象的引用,对于可变对象(mutable),这个是不允许的.例如"a=1;b=1",a和b可能指向同一个值为1的对象.(也可能不是,这个依赖具体的实现),但是对于"c=[];d=[]",可以确定的是,c和d保存了两个不同的,独立的,新创建的空列表. (需要注意的是对于c=d=[]这种写法,c和d保存的是相同的一个对象).