在c/c ++中,在函数内部创建局部变量时,堆栈中有变量.
http://effbot.org/zone/call-by-object.htm
CLU对象独立于过程激活而存在.对象的空间是从动态存储区域分配的./理论上,所有对象都将永远存在.实际上,当对象不再可由任何CLU程序访问时,可以回收对象使用的空间.
这是否意味着python中的对象是从堆创建的(如在c/c ++中的malloc)?当没有与之关联的名称时,对象会被解除分配吗?(就像智能指针一样)?
例:
def foo(a):
result = []
result.append(a)
return result
foo("hello")
myList = foo("bye")
Run Code Online (Sandbox Code Playgroud)
所以第一个结果([])是在堆中创建的并且因为没有与之关联的名称而被解除分配?
Sim*_*pin 14
是的,所有Python对象都存在于堆上(至少在CPython上.)它们是引用计数的:当对象的最后一个引用消失时,它们被解除分配.(CPython还有一个垃圾收集器来打破周期.)
在CPython中,只要函数返回,您的第一个列表就会消失,因为您没有将返回值绑定到名称并且引用计数降为零.在其他实现中,对象可以活得更长,直到垃圾收集器开始.
某些对象(如打开文件)附加了资源,这些资源在释放对象时会自动释放,但由于上述原因,建议不要依赖此对象.完成后,应明确关闭资源.
作为对其他答案的补充,这里有一种使用特殊方法跟踪垃圾收集发生时间的方法__del__:
class Test(object):
def __init__(self, name):
self.name = name
def __del__(self):
print "deleting {0}".format(self.name)
print "discarded instance creation"
Test("hello")
print "saved instance creation"
myList = Test("bye")
print "program done"
Run Code Online (Sandbox Code Playgroud)
输出:
丢弃的实例创建 删除你好 保存的实例创建 程序完成 删除再见
有关更深入的数据,请参阅gc 模块。
是的,CPython中的所有值都在堆上分配,并且引用计数以了解何时取消分配它们.与C不同,在大多数情况下无法知道某个值是否会超过其功能,因此唯一安全的做法是堆分配所有内容.
当然你可以做一些分析,并确定某些值永远不会传递给函数,因此无法逃脱,但这在Python中的使用有限,额外的开销可能不值得.