带有重复地址的Python ctypes变量

时间:2015-10-14 21:50:05

标签: python pointers ctypes

所以我正在用C开发一个共享库,我现在正在使用ctypes编写一些Python包装器。这很好,但是我遇到了原生C类型地址的问题(例如c_int)。

考虑以下SSCCE:

结构

root
-example.py
-pkg
--__init__.py
--foo.py

foo.py

from pkg import *

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

example.py

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)

根据我对ctypes的理解,我希望byref在两种情况下(即Foo.fun内和example.py内)返回3个不同的地址,因为每个对象应该是不同的

但是,当从对象的方法(在我的例子中,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个不同的地址(0x7f79379440a0,0x7f7937944130等),而Foo内的打印总是返回相同的地址(0x7f7937944250)。是什么给了什么?

0 个答案:

没有答案