如果你在不同的行上进行赋值操作,它就不会“知道”已经有一个 wtf! 对象(因为 "wtf!" 不是按照上面提到的方式被隐式驻留的)。...①中,在运行前 array 已经被重新赋值为 [2, 8, 22],因此对于之前的 1, 8, 15,只有 count(8) 的结果是大于 0 ,所以生成器只会生成 8。...②中,g1 和 g2 的输出差异则是由于变量 array_1 和 array_2 被重新赋值的方式导致的。...在第一种情况下,array_1 被绑定到新对象 [1, 2, 3, 4, 5],因为 in 子句是在声明时被执行的,所以它仍然引用旧对象 [1, 2, 3, 4](并没有被销毁)。...而异常之所以会被清除,是因为附加了回溯信息(trackback),它们与栈帧(stack frame)形成一个引用循环,使得该栈帧中的所有本地变量在下一次垃圾回收发生之前都处于活动状态(不会被回收)。