在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 >>>
内容不是对象,会为每一个创建一个内存的引用。每一次接入都会创建一个新的对象。