python从堆创建一切?

eug*_*ene 8 python variables

在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中,只要函数返回,您的第一个列表就会消失,因为您没有将返回值绑定到名称并且引用计数降为零.在其他实现中,对象可以活得更长,直到垃圾收集器开始.

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


Lau*_*low 6

作为对其他答案的补充,这里有一种使用特殊方法跟踪垃圾收集发生时间的方法__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 模块


Gab*_*abe 5

是的,CPython中的所有值都在堆上分配,并且引用计数以了解何时取消分配它们.与C不同,在大多数情况下无法知道某个值是否会超过其功能,因此唯一安全的做法是堆分配所有内容.

当然你可以做一些分析,并确定某些值永远不会传递给函数,因此无法逃脱,但这在Python中的使用有限,额外的开销可能不值得.