Python3 | 特权种族

对于一些常用的对象则采取共用对象内存的分配策略

Posted by Haauleon on October 25, 2022

对象id与id()函数

  id 是一个整型数值的内存地址,是对象在其生命周期内的唯一标识。而 id() 则是 python 内置的函数,用于获取对象的内存地址。
  通常有两种比较对象 idd 的方法:is、id() 比较,如下:

1
2
3
4
5
6
l1 = [1, 2, 3]
l2 = [1, 2, 3]
In [43]: l1 is l2 
Out[43]: False
In [46]: id(l1)==id(l2)
Out[46]: False



特权种族:共用内存的对象

  每个对象被创建时就会分配内存地址,即具有了唯一的id标识。通常来说,新对象的内存地址也是新的,会从未分配的可用地址中取。但是,为了提高内存利用效率,对于一些常用的对象,如一些数值较小的数字对象、布尔值对象、None 对象、较短的字符串对象等等,Python 采取共用对象内存的分配策略。

Python中,对于整数对象,如果其值处于 [-5,256] 的闭区间内,则值相同的对象是同一个对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 新分配内存地址的例子
ww=[1,2]
ee=[1,2]
id(ww)==id(ee) >>>False
a=2018
b=2018
id(a)==id(b) >>>False

# 共用内存地址的例子
a=100
b=100
id(a)==id(b) >>>True
f1=True
f2=True
id(f1)==id(f2) >>>True
n1=None
n2=None
id(n1)==id(n2) >>>True
s="python_cat"
t="python_cat"
id(s)==id(t) >>>True

  这就意味着,Python 中出现了特权种族,运行环境早早就为它们分配好了内存地址,一旦要创建新的对象时,先去特权种族中查找,有 Type 和 Value 相等的对象,则新对象不分配新的内存空间,而是指向已有对象。
  特权种族的存在,使得我们不需要频繁创建这些对象,既能提高已分配内存的使用率,又减少了创建对象、分配新内存的损耗。