PythoncTypes具有重复地址的变量

PythoncTypes具有重复地址的变量,python,pointers,ctypes,Python,Pointers,Ctypes,因此,我正在用C开发一个共享库,目前我正在用C编写一些Python包装。基本上没问题,但我对本地C类型的地址有问题,例如C_int 考虑以下SSCCE: 结构 福比 示例.py 从我对表单ctypes的理解来看,我希望byref在这两种情况下都返回3个不同的地址,即在Foo.fun和in-example.py中,因为每个对象都应该不同 然而,在我的例子Foo.fun中,当从对象的方法中实例化本机C类型时,我总是得到相同的地址 样本输出: Outside an object Val 1: <

因此,我正在用C开发一个共享库,目前我正在用C编写一些Python包装。基本上没问题,但我对本地C类型的地址有问题,例如C_int

考虑以下SSCCE:

结构

福比

示例.py

从我对表单ctypes的理解来看,我希望byref在这两种情况下都返回3个不同的地址,即在Foo.fun和in-example.py中,因为每个对象都应该不同

然而,在我的例子Foo.fun中,当从对象的方法中实例化本机C类型时,我总是得到相同的地址

样本输出:

Outside an object
Val 1: <cparam 'P' (0x7f79379440a0)>
Val 2: <cparam 'P' (0x7f7937944130)>
Val 5: <cparam 'P' (0x7f79379441c0)>
Within object
Val 1: <cparam 'P' (0x7f7937944250)>
Val 2: <cparam 'P' (0x7f7937944250)>
Val 5: <cparam 'P' (0x7f7937944250)>

第一次打印提供了3个不同的地址,如预期的0x7F7939440A0、0x7F793944130等,而来自Foo内部的打印始终返回相同的地址0x7F793944250。给出了什么?

ctypes对象的C数据地址由addressof返回。byref不返回地址。它创建一个引用对象的C数据的轻量级CargoObject。它仅在作为参数传递给函数指针时才有用。这包括cast等,因为ctypes使用FFI函数指针来实现它们。您看到的是一个小对象分配器重用已分配货物对象的基址的人工制品。@eryksun,实际上,它仅在作为参数传递给函数指针时才有用。您的确切意思是什么?否则建议:ctypes导出byref函数,该函数用于通过引用传递参数。仅供参考,使用ctypes创建的函数是函数指针,即ctypes的实例。\u CFuncPtr。让我们尝试更清楚地重新说明这一点。使用byref传递对ctypes对象数据的引用。但是byref不会返回将要传递的整数地址,因为它的目的是提高调用效率。使用addressof检查地址。
from pkg import *

class Foo():
  def fun(self, value):
    x = ct.c_int(value)
    print "Val "+str(value)+": " + str(ct.byref(x))
from pkg.foo import *

print "Outside an object"
x = ct.c_int(1)
print "Val 1: " + str(ct.byref(x))
y = ct.c_int(2) 
print "Val 2: " + str(ct.byref(y))
z = ct.c_int(5) 
print "Val 5: " + str(ct.byref(z))

print "Within object"
foo = Foo()
foo.fun(1)
foo.fun(2)
foo.fun(5)
Outside an object
Val 1: <cparam 'P' (0x7f79379440a0)>
Val 2: <cparam 'P' (0x7f7937944130)>
Val 5: <cparam 'P' (0x7f79379441c0)>
Within object
Val 1: <cparam 'P' (0x7f7937944250)>
Val 2: <cparam 'P' (0x7f7937944250)>
Val 5: <cparam 'P' (0x7f7937944250)>