1
1
我在python代码(在memoryobject.c的objects中)的函数memory ass_sub中发现了这个:
这就是后两个错误的根源。看起来,即使mv[0]的itemsize仍然不等于它本身。 更新 我想是这样的。当您试图在mv中赋值时,它调用objects/memoryobject.c中的memory_ass_sub,但该函数只接受一个pyobject作为输入。然后,使用pyobject_getbuffer函数将该对象更改为内部缓冲区,即使在mv[0]的情况下,它已经是一个缓冲区(以及您想要的缓冲区!)。我的猜测是,此函数接受对象并使其成为itemsize=1的简单缓冲区,而不管它是否已经是缓冲区。这就是为什么你得到不匹配的项目大小,即使
第一次作业的问题, mV[0]=0xffffffff 我认为这源于检查int是否可以用作缓冲区,而根据我的理解,目前还没有为它设置缓冲区。 换句话说,缓冲区系统目前无法处理大于1的项。看起来不太遥远,但你需要做更多的工作。如果您确实让它工作了,那么您可能应该将更改提交回主python发行版。 另一个更新 第一次尝试分配mv[0]时的错误代码源于调用pyobject_checkbuffer时,int使pyobject_checkbuffer失败。显然,系统只处理来自可缓冲对象的副本。这似乎也应该改变。 结论 目前,python缓冲区系统无法处理itemsize>1的项,如您所料。此外,它不能处理来自非缓冲对象(如int)的缓冲区分配。 |