Python内存管理说明

2/22/2017来源:ASP.NET技巧人气:1445

#coding=utf8
'''
变量和内存管理细节:
1、变量无须事先声明
2、变量无须指定类型
3、程序员不用关心内存管理
4、变量名会被"回收"
5、del语句能够直接释放资源
'''
from audioop import add
'''
Python中无需显示声明变量,变量在第一次被赋值时自动声明。
变量只有被创建和赋值后才能被使用。
'''
#PRint var #变量var没有定义
var=45
#变量一旦被赋值,就可以通过变量名来访问它
print var

'''
Python中不但变量名无需实现声明。
对象的类型和内存占用都是运行时确定的。
Python解释承担了内存管理的复杂任务。
'''
'''
Python使用引用计数来保持追踪内存中的对象。
Python内部记录着所有使用中的对象有多少引用。
一个内部跟踪变量,称为一个引用计数器。
每个对象拥有引用的个数,称为引用计数。
当对象被创建时,就创建了一个引用计数,当对象不在需要时,引用计数为0,就会被垃圾回收。
'''

'''
当对象被创建并赋值给变量时,该对象的引用计数就被设置为1。
当同一个对象的引用又被赋值给其它变量时,
或作为参数传递给函数、方法或实例时,
或者被赋值为一个窗口对象的成员时,
该对象的一个新的引用,或者称作别名,
就被创建(则该对象的引用计数自动加1)。
'''

Float=3.14      #创建一个浮点对象并将其引用赋值
Some=Float    #创建一个指向同一对象的别名Some。Float对象的引用计数加1。
add(Float,Float)       #作为参数传递给函数(新的本地引用),引用计数加1。
List=[123,Float] #称为容器对象的一个元素,引用计数加1。

'''
当对象的引用被销毁时,引用计数会减小。
当引用离开其作用范围时,所有的局部变量都被自动销毁,对象的引用计数页随之减少。
'''
def add(x,y): #局部变量x,y,当离开函数时,x,y被自动销毁
    return x+y
'''
当变量被赋值给另外一个对象时,原对象的引用计数会自动减1。
'''
foo='xyz' #创建一个字符串对象并将其引用赋值
bar=foo  #创建一个指向同一对象的别名bar。引用计数加1。
foo=123  #把整数对象赋值给变量,字符串引用计数减1。

'''
使用del删除一个变量,也会造成对象引用计数减少;
当一个对象被移出一个窗口对象时,也会造成对象引用计数减少;
'''
del   Some #对象的别名被显示销毁
List.remove(Float) #对象被从一个窗口中移除
del List #窗口对象本身被销毁


'''
del语句会删除对象的一个引用,语法格式如下:
del obj1[,obj2[,... objN]]
执行一个del语句会产生两个结果:
从现在的命名空间中删除obj、对象的引用计数减1
'''
'''
执行del语句会删除对象的最后一个引用,
也就是对象的引用计数减为0,
这会导致该对象从此“无法访问”或“无法抵达”。
该对象就成为垃圾回收机制的回收对象。
任何追踪或调试程序会给一个对象增加一个额外的引用,
这会推迟该对象被回收的时间。
'''

'''
不再被使用的内存会被一种称为垃圾收集的机制释放。
垃圾收集器是一块独立的代码,它用来寻址引用计数为0的对象。
它也负责检查虽然引用计数大于0但也应该被销毁的对象。
'''

'''
Python的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。
用来防止循环引用的产生。
'''