在c/c++中,在函数内创建局部变量时,堆栈中有变量。在
http://effbot.org/zone/call-by-object.htm
CLU objects exist independently of procedure activations. Space for objects is allocated from a dynamic storage area /.../ In theory, all objects continue to exist forever. In practice, the space used by an object may be reclaimed when the object isno longer accessible to any CLU program.
这是否意味着python中的对象是从堆创建的(就像c/c++中的malloc一样)?当没有名字关联的时候,这些对象就被释放了?(像智能指针一样)?在
示例:
def foo(a):
result = []
result.append(a)
return result
foo("hello")
myList = foo("bye")
所以第一个结果([])是在堆中创建的,并且因为没有与之关联的名称而被释放?在
作为对其他答案的补充,以下是一种跟踪垃圾收集何时发生的方法,使用特殊方法^{} :
输出:
^{pr2}$有关更深入的数据,请参阅gc module。在
是的,所有Python对象都存在于堆中(至少在CPython上是这样的),它们是引用计数的:当对对象的最后一个引用消失时,它们将被取消分配。(CPython还有一个垃圾收集器来中断循环。)
在CPython中,当函数返回时,第一个列表就会消失,因为您没有将返回值绑定到名称,并且引用计数降为零。在其他实现中,在垃圾回收器启动之前,对象可能会生存更长的时间。在
某些对象(如打开的文件)附加了资源,这些资源在释放对象时会自动释放,但由于上述原因,建议不要依赖于此。完成资源后,应该显式地关闭它们。在
是的,CPython中的所有值都是在堆上分配的,并对引用进行计数,以了解何时释放它们。与C语言不同的是,在大多数情况下无法知道一个值是否会比它的函数寿命长,所以唯一安全的做法是堆分配所有的东西。在
当然,您可以进行一些分析并确定某些值从未传递给函数,因此无法转义,但这在Python中的使用有限,额外的开销可能不值得。在
相关问题 更多 >
编程相关推荐