在许多符号数学系统中,例如Matlab或Mathematica,您可以使用类似的变量Ans或%检索最后计算的值.Python shell中是否有类似的工具?
我在Python 2.7中创建了这个函数ipython:
def _(v):
return v
Run Code Online (Sandbox Code Playgroud)
以后,如果我打电话_(somevalue),我会_ = somevalue.
in[3]: _(3)
out[3]: 3
in[4]: print _
out[4]: 3
Run Code Online (Sandbox Code Playgroud)
功能消失了!如果我打电话给_(4)我:
TypeError: 'int' object is not callable`
Run Code Online (Sandbox Code Playgroud)
为什么?这个功能出了什么问题?
我注意到有关CPython的对象释放的一些事情引起了我的好奇心.假设我定义了一个从其tp_dealloc函数中打印消息的类型:
static void pyfoo_Bar_dealloc(pyfoo_Bar* self)
{
PySys_WriteStdout("Bar freed\n");
self->ob_type->tp_free((PyObject*)self);
}
Run Code Online (Sandbox Code Playgroud)
我也用分配器做了正确的事情:
PyMODINIT_FUNC initpyfoo(void)
{
PyObject* m;
pyfoo_BarType.tp_new = PyType_GenericNew;
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
我编译它并在目录中运行Python 2.6解释器pyfoo.so:
>>> import pyfoo
>>> a = pyfoo.Bar()
>>> a = None
Bar freed
>>> quit()
Run Code Online (Sandbox Code Playgroud)
这就是我所期望的......引用计数降为零并Bar收集对象.但现在如果我这样做:
>>> import pyfoo
>>> pyfoo.Bar()
<pyfoo.Bar object at 0x7f7c6d8f2080>
>>> quit()
Bar freed
Run Code Online (Sandbox Code Playgroud)
...在Bar解释器退出之前,不会收集对象.但是,Bar匿名创建的对象的引用计数肯定是零,就像显式分配的那样.那么为什么它在创作后不会立即解除分配?
(我在Debian Squeeze上用Python 2.6.6编译了GCC 4.4.5.我知道这不是一个"bug",我知道Python-the-language并没有对Python解释器施加任何特殊限制.我只是想知道引擎盖下发生了什么,使它忽略了这样的匿名对象.)
我正在使用type()Python中的方法,并遇到了这个:
>>> type(_)
<type 'type'>
Run Code Online (Sandbox Code Playgroud)
下划线(_)字符的"类型" type本身就是.那有什么意思?