PS:本文以官方文章的内容为主,并尝试加入一些自己的理解。
3.1 对象(s),价值(s)和类型(s)。
对象是python绝对数据类型,所有python program中的数据,或者被对象所代表,或者被对象之间的联系所代表。(某种意义上,符合冯.诺依曼“可储存可编程计算机”的模型,code也可被对象代表)
每一个对象都有一个identity,一个类型和一个值。一个对象的identity,一旦对象被创造,就绝不会改变;你可以把它认为是对象在内存中的地址。“is”操作符自动比较两个对象的identity;id函数返回一个整数,代表所传参数的identity(当前被执行的对象,所在的内存地址)。一个对象的类型也不会改变(它确实可能在某些情形下改变一个对象的类型,在确定的控制条件下。尽管它通常不是一个好主意,因为如果被处理的不正确,它能引起一些非常奇怪的行为)。一个对象的类型决定了该对象所支持的操作。(比如:它有一个长度吗?),也定义了该对象的当前类型下,可能的值们(s)。type()函数返回一个对象的类型(它就是一个对象它自己),一些对象的值能改变。那些值可以改变的对象被称为可变的(mutable),那些一旦被创造,值就不能改变的对象被叫做不可变的(immutable)。(一个不可变的容器对象,包含了一个到可变对象的引用,该对象可以改变当之后的值被改变了,尽管该容器仍然被认为不可变的,因为对象的收集器它所包含的不能被改变。因此,不可变并不是严格和拥有一个不能改变的值一样,它更加灵活。)一个对象的不可变性决定于它的类型;如:数字,字符串和元组是不可变的,同时字典和列表是可变的。
对象(object)绝不会被明显的破坏掉;但是,当他们变得不能达到时,他们可能被(当成)垃圾回收。一个实现方法被允许延迟垃圾回收或者始终忽略它——垃圾回收机制如何被执行是一件关乎执行质量的事情,只要对象仍然是可以达到的,就没有对象会被回收。
CPython执行细节:CPython当下使用了一种联系-计数方案有(可选)延迟监视的不断循环连接垃圾箱,很多对象一旦变成不到达的,就被该垃圾箱回收,但是它不保证收集那些含有循环引用的垃圾。更多的关于循环垃圾回收的控制参考gc模块的文档。其他一些不同地的执行行为,CPython可能改变。当它们变得不能达到时,不要依赖于立即得到的对象的最终结果。(除了:永远关闭文件)
注意:在执行期间使用追踪和debug功能,将保持那些正常情况下被回收的objects依然存活。也要注意到,通过"try...except"语句捕获了一个异常,也会保持objects存活。
一些对象含有链接到“外部”资源(如打开一个文件或者一个窗口)的引用。应该理解:当对象被当作垃圾回收,这些资源会被释放,但是因为垃圾回收不保证会发生,这些对象也提供了一个明确的方式释放外部资源,通常通过close()方法。强烈建议程序明确地关闭这样的对象。“try...finally”语句为做这件事提供了一个很实用的途径。
一些对象含有链接到其他对象的引用,它们被称为容器。一些容器的例子,如元组、列表和字典。引用是容器值的一部分。在多数的例子中,当我们谈论一个容器的值时,我们暗指值(values),不是这容器对象的identities;当我们讨论一个容器的可变性时,暗指当前容器对象唯一的identities。
待续