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 解释器将在合适的时间回收它。


Hermera