关于Python的垃圾回收机制的一点补充

 

本文是对浅析Python的垃圾回收机制(Garbage Collection)一文的一些补充。

声明:本文的代码均运行在Python3.6.5环境下。

小整数对象池

整数在程序运行中应用广泛,为了提高效率,Python在内存中提前创建好了一些整数(并称其为小整数),这些小整数不参与垃圾回收,因此避免了频繁地为它们申请及释放内存带来的性能问题。也就是说,你程序中用到的所有小整数其实都是同一个对象,都指向同一块内存单元。如下:

在Python中,小整数的定义是[-5, 256]这个闭区间的整数。

a = -5
b = -5
print(a is b)  # 输出:True

c = 256
d = 256
print(c is d)  # 输出:True

e = -6
f = -6
print(e is f)  # 输出:False

g = 257
h = 257
print(g is h)  # 输出:False

关于字符串对象

  1. 字符串也是有一个对象池的,相同的字符串(长度在20个单位以内的)对应同一个内存地址。
  2. 如果字符串中有空格(space)的话,即便是相同的字符串,Python也会创建两个不同的对象。
  3. 如果字符串的长度超过20个单位,那么根据创建方式的不同,Python会采取不同的策略,通过下面的代码可知:如果字符串的创建方式是提供完整的字符串字面值,则Python只创建一个对象;如果字符串创建时并未提供提供完整的字符串字面值,则Python会创建不同的对象,它们在内存中对应多个内存地址。
s1 = 'helloworld'
s2 = 'helloworld'
print(s1 is s2)  # 输出:True

s3 = 'hello world'
s4 = 'hello world'
print(s3 is s4)  # 输出:False

s5 = 'abcdefghijklmnopqrstuvwxyz'
s6 = 'abcdefghijklmnopqrstuvwxyz'
print(s5 is s6)  # 输出:True

s7 = 'a' * 20
s8 = 'a' * 20
print(s7 is s8)  # 输出:True

s9 = 'a' * 21
s10 = 'a' * 21
print(s9 is s10)  # 输出:False

s11 = 'aaaaaaaaaaaaaaaaaaaaa'
s12 = 'aaaaaaaaaaaaaaaaaaaaa'
print("length of s11 is ", len(s11))  # 输出:length of s11 is  21
print(s11 is s12)  # 输出:True