对象池 (需要交互模式)
小整数池
Python为了优化速度, 使用了小整数对象池, 避免为整数频繁申请和销毁内存空间
Python 对小整数的定义是 [-5, 256] ,这些整数对象是提前建立好的, 不会被垃圾回收
在一个 Python 的程序中, 无论这个整数处于LEGB (局部变量, 闭包, 全局, 内建模块) 中的哪个位置, 所有位于这个范围内的整数使用的都是同一个对象
for k, _ in enumerate(range(-5, 256+1)):
if k % 10 == 0:
print()
print(str(_).zfill(3), id(_), '|', end=' ')
# id相同
a = 200
print(id(a))
b = 200
print(id(b))
大整数池
默认创建出来, 池内为空的, 创建一个就会往池中存储一个
# id不同
c = 288
print(id(c))
d = 288
print(id(d))
短字符串池 (intern机制)
每个单词(字符串), 不夹杂空格或者其他符号, 默认开启intern机制, 共享内存, 靠引用计数决定是否销毁
python中对大于256的整数, 会重新分配对象空间地址保存对象
对于字符串来说, 如果不包含空格的字符串, 则不会重新分配对象空间, 对于包含空格的字符串则会重新分配
# intern机制 id相同 <=256 256k
a = 'CY3761'
print(a, a.__sizeof__(), id(a))
b = 'CY3761'
print(b, b.__sizeof__(), id(b))
# intern机制 id不相同
c = 'CY3761 '
print(c, c.__sizeof__(), id(c))
d = 'CY3761 '
print(d, d.__sizeof__(), id(d))