python从堆创建一切?

2024-06-17 12:08:11 发布

您现在位置:Python中文网/ 问答频道 /正文

在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")

所以第一个结果([])是在堆中创建的,并且因为没有与之关联的名称而被释放?在


Tags: theto对象函数inhttpbyobjects
3条回答

作为对其他答案的补充,以下是一种跟踪垃圾收集何时发生的方法,使用特殊方法^{}

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"

输出:

^{pr2}$

有关更深入的数据,请参阅gc module。在

是的,所有Python对象都存在于堆中(至少在CPython上是这样的),它们是引用计数的:当对对象的最后一个引用消失时,它们将被取消分配。(CPython还有一个垃圾收集器来中断循环。)

在CPython中,当函数返回时,第一个列表就会消失,因为您没有将返回值绑定到名称,并且引用计数降为零。在其他实现中,在垃圾回收器启动之前,对象可能会生存更长的时间。在

某些对象(如打开的文件)附加了资源,这些资源在释放对象时会自动释放,但由于上述原因,建议不要依赖于此。完成资源后,应该显式地关闭它们。在

是的,CPython中的所有值都是在堆上分配的,并对引用进行计数,以了解何时释放它们。与C语言不同的是,在大多数情况下无法知道一个值是否会比它的函数寿命长,所以唯一安全的做法是堆分配所有的东西。在

当然,您可以进行一些分析并确定某些值从未传递给函数,因此无法转义,但这在Python中的使用有限,额外的开销可能不值得。在

相关问题 更多 >