当我创建类型为ctype.c_int的变量时,它会报告该类型,并且不允许任何数学运算:

In [107]: x = c_int(1)
In [108]: x
Out[108]: c_int(1)
In [109]: x+=1
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
----> 1 x+=1
TypeError: unsupported operand type(s) for +=: 'c_int' and 'int'

In [110]: x+=x
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
----> 1 x+=x
TypeError: unsupported operand type(s) for +=: 'c_int' and 'c_int'

In [111]: type(x)
Out[111]: ctypes.c_int

另一方面:当我制作一个内部有c_int的 struct 时,它被报告为int,允许数学运算,但似乎仍然被存储为32位c整数,因为它正确地包装在32位上,并且在位置31处尊重符号位.

In [112]: class REC(ctypes.Structure): _fields_=[('x',ctypes.c_int),('y',ctypes.c_int)]
In [113]: rec = REC()

In [114]: rec.x
Out[114]: 0

In [114]: type(rec.x)
Out[114]: int                       # why not ctypes.c_int ???

In [116]: rec.x+=0x7FFFFFFF         # += works, so it is regular python int ?

In [117]: rec.x
Out[117]: 2147483647

In [118]: rec.x+=1

In [119]: rec.x
Out[119]: -2147483648               # but it honors sign bit at position 31...

In [122]: rec.x=0xFFFFFFFF

In [123]: rec.x
Out[123]: -1

In [124]: rec.x+=1

In [125]: rec.x
Out[125]: 0                         # ...and it wraps on 32 bits, so it is NOT python int!

有人能解释这种行为吗?这背后有什么逻辑吗?

推荐答案

c_int必须有两个identities:C对象和Python对象x,前者的addressof可以被取.前者是整数,但后者不是.(请记住,x=2只会重新绑定x,不会更新C整数.)

将变量放入 struct 中时,ctypes可以作为convenience提供一个基于属性的接口,在C和Python表示之间进行转换.然后你会发现这家店有很大的价值.制造的对象是真正的Python对象,但它们当然不遵循Python rules,因为它们不拥有任何数据.

这同样适用于裸整数的value属性.

奇怪的是,它相当于 struct 中的一个裸整数,所以你不能轻易地将 struct 成员传递给函数来填充它.

Python相关问答推荐

在for循环中仅执行一次此操作

使用pandas、matplotlib和Yearbox绘制时显示错误的年份

为什么我的Python代码在if-else声明中的行之前执行if-else声明中的行?

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

两个pandas的平均值按元素的结果串接元素.为什么?

无法定位元素错误404

所有列的滚动标准差,忽略NaN

递归访问嵌套字典中的元素值

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "

如何使用正则表达式修改toml文件中指定字段中的参数值

删除特定列后的所有列

如何将泛型类类型与函数返回类型结合使用?

为什么dict. items()可以快速查找?

如何用FFT确定频变幅值

极点替换值大于组内另一个极点数据帧的最大值

如何提高Pandas DataFrame中随机列 Select 和分配的效率?

操作布尔值的Series时出现索引问题

Polars定制函数返回多列

从列表中分离数据的最佳方式

VSCode Pylance假阳性(?)对ImportError的react