楼主列的C++的例子是非常简单而且典型的,看看汇编代码也能知道
python的代码,不好去看解释器的实现,顶多是加点打印变量地址的代码输出看看,然后就是一些解释器的实现的原则性描述。Ned Batchelder总结了几条,比较清楚,帖子标题是Facts and myths about Python names and values,贴不了URL了
【 在 VincentGe 的大作中提到: 】
: 我大概理解问题在哪了。
: 我使希望使用Python代码来说明CPP代码存在的问题的,但是两个在这里有些差异,我混用了一些术语造成误解。
: 对于Python,在这个示例中,虽然和CPP不同,但在形式上是相同的,在循环中,创建了一个自由变量ai,它被分配在堆上,lambda引用了自由变量ai,但经过三次循环,ai的值被不断改变,最终调用时指向最后一次创建的ai,但如果我们提前del ai或 ai=None,就会导致指向的在堆上的空间被回收,出现错误,你给出的写法,也是Python文档里面的写法,通过复制值的方式,将其传递给lambda,虽然看似相同,但实际上此时ai,被分配在栈上,lambda被调用时,此时ai在新的栈帧中,因此没有问题。
: ...................
--
FROM 123.118.184.*