Skip to main content
 首页 » 编程设计

python之(ctypes.c_int * len(x))(*x) 是做什么的

2025年05月04日35itcoder

我正在使用 pyOpenGL,Op​​enGL 要求我通过传递指针和要传输的字节数来传输数据。

我知道 python 不像 c 那样在内存中存储变量。我找到了使我的程序运行的以下代码:

x = [1, 2, ... ]              # some list 
(ctypes.c_int * len(x))(*x) 

但是我不知道它为什么会起作用(而且我不想相信我并没有因为一切都落入内存而幸运)。这段代码实际上在做什么?

请您参考如下方法:

根据Python documentation :

The recommended way to create concrete array types is by multiplying any ctypes data type with a positive integer. Alternatively, you can subclass this type and define length and type class variables. Array elements can be read and written using standard subscript and slice accesses; for slice reads, the resulting object is not itself an Array.

Example:

>>> from ctypes import * 
>>> TenIntegers = c_int * 10 
>>> ii = TenIntegers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
>>> print ii 
<c_long_Array_10 object at 0x...> 
>>> for i in ii: print i, 
... 
1 2 3 4 5 6 7 8 9 10 
>>> 

因此,第一部分 ctypes.c_int * len(x) 创建了一个包含 len(x) 元素的数组类型:

In [17]: ctypes.c_int * 10 
Out[17]: __main__.c_int_Array_10 
 
In [18]: ctypes.c_int * 100 
Out[18]: __main__.c_int_Array_100 

创建类型后,您应该调用它并传递数组元素:

(ctypes.c_int * len(x))(*x) 
#                      ^^^^ 

创建的数组类型接受可变数量的元素,因此,您应该 expand list x using the *x form :

In [24]: x = [1, 2, 3] 
 
In [25]: (ctypes.c_int * len(x))(*x) 
Out[25]: <__main__.c_int_Array_3 at 0x7f0b34171ae8> 
 
In [26]: list((ctypes.c_int * len(x))(*x)) 
Out[26]: [1, 2, 3] 
 
In [27]: (ctypes.c_int * len(x))(*x)[1] 
Out[27]: 2 

您不能传递 x,因为 __init__ 需要整数:

In [28]: (ctypes.c_int * len(x))(x) 
--------------------------------------------------------------------------- 
TypeError                                 Traceback (most recent call last) 
<ipython-input-28-ff45cb7481e4> in <module>() 
----> 1 (ctypes.c_int * len(x))(x) 
 
TypeError: an integer is required (got type list)