Python 构造对象的机制
这里 python 的机制与 c++ 不同。
python 使用对象模型来存储数据,构造任何类型的值都是一个对象。所有的 python 对象都拥有三个特性:身份、类型和值。
-
身份:每个对象都有一个唯一的身份标识自己,对象的身份可以用内建函数
id()
来得到。这个值可以被认为是该对象的内存地址。 -
类型:描述一种对象的类型所需要的信息不可能用一个字符串来搞定,所以类型不能是一个简单的字符串。这些信息不能也不应该和数据保存在一起,所以我们将类型定义成对象,这就是说类型对象,所有类型对象的类型都是 type 。可以用内建函数
type()
查看对象的类型。 -
值:对象表示的数据项。如果对象支持更新操作,那么它的值就可以改变,否则它的值就是只读的。对象的值是否可以改变被称为对象的可改变性。
这也是 python 中没有自增运算符 ++
的原因。
对象的创建
举例来说,对于如下语句
x = 20000527
程序会生成一个 int 对象,该对象有唯一的 id ,类型为 int,值为 20000527。
接下来,程序将创建变量 x,并创建一个引用,将 x 指向刚才创建的对象。
x = 20000527 y = 20000527 z = x
若上述语句存在于同一个代码块中,则 x, y, z 指向同一个地址(即为 20000527 这个对象申请的内存地址),这三个变量的 id 也相同。
如果上述变量不存在于同一个代码块呢?
>>> x = 1 >>> y = 1 >>> x is y True >>> x = 20000527 >>> y = 20000527 >>> x is y False >>> x = 'ab' >>> y = 'ab' >>> x is y True >>> x = 'gubed is a nice boy' >>> y = 'gubed is a nice boy' >>> x is y False >>> x = '%^%%&*%%%^*^%/' >>> y = '%^%%&*%%%^*^%/' >>> x is y False >>> x = 1.1 >>> y = 1.1 >>> x is y False >>> x = 1.1; y = 1.1; x is y True >>> x = y >>> x is y True
x is y
等价于 id(x) == id(y)
。
由于小整数使用频繁,每次都创建新对象影响程序效率,所以对于 [-5, 256] 的小整数,python 预留了小整数对象池,所有的小整数都指向这些对象(即使不在一个代码块内)。 而对于大整数的处理,就像上面说的那样,如果在一个代码块内就不会重复创建。
而字符串的规则是,只包含 [a, z] 字母的字符串只会被创建一次(python 认为这些字符串复用率高),其他的字符串则会被重复创建。 浮点数的规则和大整数相同。
对象的删除
在 c++ 中,提供了 new
/delete
来创建/删除对象。
python 没有 new
关键字,del
也不能删除对象。严格来说,你没有办法在一个 python 程序显式地使用语句中删除一个对象。
x = 1 del x
上述程序的第一行创建了一个对象并将变量 x 指向它。
上述程序的第二行解除了 x 对该对象的引用。
也就是说,del
的作用就是解除变量对对象的引用。
而 python 的所有对象都自带一个计数器,表示有多少个变量指向该对象。 当该对象不再被引用时,python 解释器将在合适的时间回收它。