ctypes之 结构体操作

在ctypes中有一些不同之处。

比如下面的案例。

>>> from ctypes import *
>>> class POINT(Structure):
...     _fields_ = ("x", c_int), ("y", c_int)
...
>>> class RECT(Structure):
...     _fields_ = ("a", POINT), ("b", POINT)
...
>>> p1 = POINT(1, 2)
>>> p2 = POINT(3, 4)
>>> rc = RECT(p1, p2)
>>> print(rc.a.x, rc.a.y, rc.b.x, rc.b.y)
1 2 3 4
>>> # now swap the two points
>>> rc.a, rc.b = rc.b, rc.a
>>> print(rc.a.x, rc.a.y, rc.b.x, rc.b.y)
3 4 3 4
>>>

创建了两个结构体。然后点和矩形。

两个点分别表示p1,p2,p1,p2分别作为矩形的左上角定点,和右上角顶点。

然后进行a,b变量进行交换,即交换p1,p2两点。但是输出的与相像的不同。为什么呢,下面这个就是上面交换的步骤。

>>> temp0, temp1 = rc.b, rc.a
>>> rc.a = temp0
>>> rc.b = temp1
>>>

原文:

temp0和temp1都是使用的rc对象的内部内存(c风格),所以执行 rc.a = temp0,就是将temp0的值复制到rc的a中。那么,以此类推,temp1也是如此。所以最后一个复制rc.b=temp1没有预期的效果。

temp0和temp1都只是引用。即rc.a = temp0 = rc.b那么rc.a和rc.b都已经变成了3,4,最后一个就没有什么用了。

 所以,最好对结构体,共用体,array对象进行操作是进行拷贝成员,而不是通过一个容器类进行获取源对象的引用。

也就是操作实体,避免使用引用。

这个就是对ctypes对象进行操作,每一次会对指针的内容进行创建一个对象。 

>>> s = c_char_p()
>>> s.value = "abc def ghi"
>>> s.value
'abc def ghi'
>>> s.value is s.value
False
>>>

内容不是对象,会为每一个创建一个内存的引用。每一次接入都会创建一个新的对象。

猜你喜欢

转载自blog.csdn.net/rubikchen/article/details/89638171