当前位置:编程学习 > python >>

Python的引用计数器

引用计数器:

        包保持追中内存中的对象,Python使用了引用计数器这个简单的技术。也就是说Python内部记录着所有使用中的对象有多少引用。一个内部跟踪变量,称为一个引用计数器。当对象被创建时,就创建了一个引用计数,当这个对象不再需要时,也就是说,这个额对象的引用计数变为0时,它被垃圾回收。(这个只是形象的说一下,并不是严格的100%正确,但是通俗的理解往往是最好的学习方式)

 


增加引用计数:

        当对象被创建并(将其引用)赋值给变量时,该对象的引用技术就是被设置为1。

        当同一个对象的应用或者是对象又被赋值给其他变量时,或者作为参数传递个函数,方法或类实例时,或者被赋值为一个窗口对象的成员是,该对象的一个新的引用,或者称作别名,就被创建(则该对象的引用技术自动加1)


 
 

<SPAN style="FONT-SIZE: 18px">x = 1 
y = x</SPAN> 

x = 1
y = x     

  语句x=1创建了一个对象并将其引用赋值给x。x是第一个引用,因此,该对象的引用技术被设置为1.语句y=x创建了一个指向同一对象的别名y。事实上并没有为y创建一个新对象,而是该对象的引用计数增加了1次。这是对象引用技术增加的方式之一。还有一些其他的方式也能增加对象的引用计数,比如该对象作为参数被函数调用或者这个对象被加入到某个容器对象当中时。

总之,对象的引用计数在:

1.对象被创建时

2.另外的别名被创建

3.被作为参数传递给函数(新的本地引用)

4.成为容器对象的一个元素

 


减少引用计数:

        当对象的引用被销毁时,引用技术会减少。最明显的例子就是当引用离开其作用范围时,这种情况最经常出现在函数运行结束时,所有局部变量都被自动销毁,对象的引用技术也就随之减少。

       当变量被赋值给另外一个对象时,源对象的引用技术也会自动减1:

       foo='xyz'

       bar=foo

       foo=123

       当字符串对象‘xyz’被创建建并赋值给foo时,它的引用计数是1.当增加了一个别名bar时,引用计数变成了2,不过当foo被重新赋值给整数对像123时,xyz对象的引用技术自减1,又变成1了。

       其他造成对象的引用计数减少的方式包括使用del语句删除一个变量,或者当一个对象的引用技术在一下情况会减少:

1.一个本地引用离开了其作用范围,比如函数结束

2.对象的别名被显示的销毁

3.对象的一个别名被赋值给其他的对象

4.对象被从一个窗口对象中移除

5.窗口对象本身被销毁

 


Del语句解析:

         del语句会删除对象的一个引用,它的语法是:

         del obj1[,obj2[,...objN]]

引申一下:

        执行del x语句会删除该对象的最后一个引用,也就是该对象的银红技术会减为0,这回导致该对象从此‘无法访问’或者‘无法抵达’。从此刻起,该对象就会成为垃圾回收机制的回收对象。注意任何追踪或者调试程序会给一个对象增加一个额外的引用,这会推迟该对象被回收的时间。

 


垃圾收集:

          不再被使用的内存会被一种称为垃圾收集的机制释放。像上面说的,虽然解释器跟踪对象的引用计数,但是垃圾收集器负责释放内存。垃圾收集器是一块独立的代码,它用来寻找引用计数为0的对象,他也负责检查那些虽然引用技术大于0但也该被销毁的对象。特定情形会导致循环引用。

          一个循环引用发生在当你有至少两个对象互相引用时,也就是所说的引用都消失时,这些引用仍然存在,这说明只靠引用计数是不够的。Python的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。当一个对象的引用技术变为0,解释器会暂停,释放掉这个对象和仅有这个对象可访问的其他对象,作为引用计数的补充,垃圾收集器也会留心被分配的总量很大(以及未通过引用计数销毁的那些)  的对象。在这种情况下,解释器会暂停下来,试图清理所有为引用的循环。

 

补充:Web开发 , Python ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,