对象池与intern
1. 字母小整数对象池
整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间。
Python 对小整数的定义是[-5, 257]这些整数对象是提前建立好的,不会被垃圾回收。在一个Python 的程序中,所有位于这个范围内的整数使用的都是同一个对象。
同理,单个字母也是这样的。
py
a = 10
b = 10
a is b # True
c = "a"
d = "a"
c is d # True
2. intern
对于纯字母数字构成的字符串,Python使用了intern
机制,类似与C#当中的字符串拘留池。
字符串是不可变类型,当我们新建一个字符串对象时,解释器会先搜索是否已经存在相同的字符串,如果存在则直接将其地址赋值给变量,如果没有则新建。当字符串对象引用计数为0时,会被GC回收。
py
a = "hello123"
b = "hello123"
a is b # True
c = "Hello world"
d = "Hello world"
c is d # False intern机制仅适用于纯字母数字
e = str(123)
f = "123"
e is f # False intern适用于类型转换的对象