python结构体内函数_Python入门之函数结构
python如何传递给c++一个结构体指针?前提是swig封装的C++函数,请写出代
在封装的代码间传递指针你要确保他们运行在相同的地址空间里,还要保证指针指向的内存的生存期是安全的,否则这种思路就是错误的.实现方法举例如下:
①.、定义了C
结构体和函数如下
typedef
struct
NameAge
{
char
int
age;
}NameAge
,
*NameAgePointer;
void
test(NameAgePointer
p)
//
接收结构体指针
do
something
with
p...
}
#python中结构体定义
class
PyStruct():
def
__init__(self,
name,
age):
self.name
=
name
self.age
age
fred
PyStruct("fred",
import
example
example.test(pointer(fred))
好了,全部的基本思路,因为搭建开发环境和过程比较繁杂,没有验证过,但是应该没有大问题
Python中如何使用C的结构体struct求解
閟truct就可以使用结构体了:
import struct
生成一个结构体实例:
其中的format_string用来指定结构体的格式(指明该结构体在C中的定义),由两部分组成:
首先是一个可选的特殊字符,用来指明字节序、数据类型大小和对齐方式:
@: native order, size alignment (default)
=: native order, std. size alignment
: little-endian, std. size alignment
: big-endian, std. size alignment
!: same as
然后是指明结构体定义的部分:
The remaining chars indicate types of args and must match exactly;
these can be preceded by a decimal repeat count:
x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;
h:short; H:unsigned short; i:int; I:unsigned int;
l:long; L:unsigned long; f:float; d:double.
Special cases (preceding decimal count indicates length):
s:string (array of char); p: pascal string (with count byte).
Special case (only available in native format):
P:an integer type that is wide enough to hold a pointer.
Special case (not in native mode unless 'long long' in platform C):
q:long long; Q:unsigned long long
Whitespace between formats is ignored.
如果struct模块的函数出错,将产生struct.error异常.
python里面可以定义结构体吗
Python中没有专门定义结构体的方法,但可以使用class标记定义类来代替结构体,
其成员可以在构造函数__init__中定义,具体方法如下.
复制代码代码如下:
class item:
def __init__(self):
self.name = '' # 名称
self.size = 10 # 尺寸
self.list = [] # 列表
a = item() # 定义结构对象
a.name = 'cup'
a.list.append('water')
Python里面的函数怎么按引用传递参数
如果你用C给Matlab写过MEX程序,那么这个问题是很容易理解的(好像每次讨论Python问题时我总是把Matlab搬了出来...... <<在Matlab中把struct当成Python中的Dictionary使用>><
既然提到了MEX,就简单说一下:
一个Matlab可能形如
如果在C的层面实现这个函数,就会看到另一种景象:
void mexFunction(int nlhs,mxArray * plhs[],int nrhs,const mxArray * prhs[])
a,b,c三个参数的地址放在一个指针数组里,然后把这个指针数组的首地址作为参数prhs传递给函数,这说明Matlab函数的参数是传递指针的,而不是值传递.
纵然是传递的指针,但是却不能在函数里改变实参的值,因为标记为"const"了.
Python是开放源码的,我没有看.所以下面很多东西是猜的.
首先介绍一个重要的函数:
help(id)
Help on built-in function id in module __builtin__:
id(...)
id(object) - integer
Return the identity of an object. This is guaranteed to be unique among
simultaneously existing objects. (Hint: it's the object's memory address.)
看最后括号里那句:Hint:it's the object's address.(它是对象的地址)
有了这个函数,下面的事情就方便多了.
a=0
id(a)
a=1
可以看出,给a赋一次值,a的address就改变了.在C的层面看,(也许真实情况不是下面的样子,但作为一个类比应该还是可以的):
void * pa;
pa=malloc(sizeof(int));
*(int *)pa=0;
free(pa);
*(int *)pa=1;
Python中每次赋值会改变变量的address,分配新的内存空间,所以Python中对于类型不像C那样严格要求.
下面看看Python函数参数传递时到底传的什么:
有一个函数:
def changeA(a):
... print id(a)
... a=100
设定一个变量var1:
var1=10
id(var1)
changeA(var1)
var1
调用函数后,从两次print的结果可以看出,传递确实是地址.但是即便如此,在函数内对形参的修改不会对实参造成任何实质的影响,因为对形参的重新赋值,只是改变了形参所指向的内存单元(changeA里两次调用print id(a)得到不同的结果),却没有改变实参的指向.在C的层面看也许类似下面的情节:
void changeA(void * pa)
*(int *)pa=100;
精通C的你一眼就看出这个函数永远也改变不了它外面的世界.
也就是说虽然传递的是地址,但像changeA这样的函数改变不了实参的值.
也许会感到困扰?不,我已经在Matlab中习惯了.
一个最典型的例子就是Matlab中删除结构体成员的rmfield函数(参见<
如果想删除结构体patient的name成员,用
rmfield(patient, 'name');
是永远达不到目的的(就像试图用双手抓住自己的领子,把自己提到空中);
迷途知返的做法是:
patient = rmfield(patient, 'name');