Python是怎样应对垃圾的?

引用和对象

为了探索对象在内存的存储,我们可以求助于Python的内置函数id()。它用于返回对象的身份(identity)。其实,这里所谓的身份,就是该对象的内存地址。


  1. a = 1  
  2. print(id(a))  
  3. print(hex(id(a))) 

在我的计算机上,它们返回的是:


  1. 11246696  
  2. '0xab9c68' 

分别为内存地址的十进制和十六进制表示。

在Python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用。当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象。


  1. a = 1  
  2. b = 1  
  3. print(id(a)) 
  4. print(id(b)) 

上面程序返回


  1. 11246696  
  2. 11246696 

可见a和b实际上是指向同一个对象的两个引用。

为了检验两个引用指向同一个对象,我们可以用is关键字。is用于判断两个引用所指的对象是否相同。


  1. # True  
  2. a = 1  
  3. b = 1  
  4. print(a is b)  
  5. # True  
  6. a = "good"  
  7. b = "good"  
  8. print(a is b)  
  9. # False  
  10. a = "very good morning"  
  11. b = "very good morning"  
  12. print(a is b)  
  13. # False  
  14. a = []  
  15. b = []  
  16. print(a is b) 

上面的注释为相应的运行结果。可以看到,由于Python缓存了整数和短字符串,因此每个对象只存有一份。比如,所有整数1的引用都指向同一对象。即使使用赋值语句,也只是创造了新的引用,而不是对象本身。长的字符串和其它对象可以有多个相同的对象,可以使用赋值语句创建出新的对象。

在Python中,每个对象都有存有指向该对象的引用总数,即引用计数(reference count)。

我们可以使用sys包中的getrefcount(),来查看某个对象的引用计数。需要注意的是,当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,会比期望的多1。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章