python宏函数 python调用vba宏( 二 )


此外,对于 字符串 对象,Python还有一套内存复用机制,如果两个字符串变量值相同,那它们将共用同一个对象:
对于 数值型 对象,Python会默认创建0~2 8以内的整数对象,也就是 0 ~ 256 之间的数值对象是共用的:
按照Python数据类型,对象可分为以下几类:
Python创建对象有两种方式,泛型API和和类型相关的API
这类API通常以 PyObject_xxx 的形式命名 , 可以应用在任意Python对象上 , 如:
使用 PyObjecg_New 创建一个数值型对象:
这类API通常只能作用于一种类型的对象上,如:
使用 PyLong_FromLong 创建一个数值型对象:
在我们使用Python声明变量的时候,并不需要为变量指派类型,在给变量赋值的时候,可以赋值任意类型数据 , 如:
从Python对象的定义我们已经可以知晓造成这个特点的原因了,Python创建对象时,会分配内存进行初始化,然后Python内部通过 PyObject* 变量来维护这个对象,所以在Python内部各函数直接传递的都是一种泛型指针 PyObject*  , 这个指针所指向的对象类型是不固定的,只能通过所指对象的 ob_type 属性动态进行判断,而Python正是通过 ob_type 实现了多态机制
Python在管理维护对象时,通过引用计数来判断内存中的对象是否需要被销毁 , Python中所有事物都是对象,所有对象都有引用计数 ob_refcnt。
当一个对象的引用计数减少到0之后,Python将会释放该对象所占用的内存和系统资源 。
但这并不意味着最终一定会释放内存空间,因为频繁申请释放内存会大大降低Python的执行效率,因此Python中采用了内存对象池的技术,是的对象释放的空间会还给内存池,而不是直接释放 , 后续需要申请空间时,优先从内存对象池中获取 。
如何用Python封装C语言的字符串处理函数在C语言中python宏函数 , 字符串处理是每天都要面对python宏函数的问题 。我们都知道C语言中其实并没有一种原生python宏函数的字符串类型,‘字符串’在C语言里只是一种特殊的以''结尾的字符数组 。因此,如何将C语言与更高层次的Python语言在‘字符串’处理这个问题上对接是一个有难度的问题 。所幸有swig这种强大的工具 。
如何封装一个函数 , 它修改参数字符串的内容
假如有这样一个C语言的函数 , 
!-- lang: cpp --
void FillZero(char* pc,size_t * piLen)
{
size_t i=0;
while(i++*piLen/2 )
*pc++ = '0';
*pc = 0;
*piLen = i+1;
}
这个函数的功能是把字符串变成n个0 。不过我们更关注函数的形式 。这样的函数,表面上看char* pc是函数的参数,可是实际上它才是函数的返回值和执行的结果 。piLen这个参数既是pc的最大长度,也是新的字符串的长度 。我们直接用python封装,看看运行结果 。
Type "help", "copyright", "credits" or "license" for more information.
import cchar
s='123456'
cchar.FillZero(s,6)
Traceback (most recent call last):
File "stdin", line 1, in module
TypeError: in method 'FillZero', argument 2 of type 'size_t *'
结果差强人意,不是我们想要得到的结果 。函数的第二个参数为size_t* 我们很难用python来表示 , 而且python中也不存在既是输入,也是输出的参数 。
swig有一个标准库,其中有一个cstring.i文件就是用来解决C语言字符串类型的问题 。
我们在.i文件中加入这样几行
!-- lang: cpp --
%include "cstring.i"
%cstring_output_withsize(char* pc,size_t* pi)
void FillZero(char* pc, size_t* pi);
然后运行看结果

推荐阅读