繁体   English   中英

(ctypes.c_int * len(x))(* x)有什么作用?

[英]What does (ctypes.c_int * len(x))(*x) do?

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

我知道python不会像c那样在内存中存储变量。 我发现以下使程序正常工作的代码:

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

但是,我不知道它为什么起作用(而且我不只是想相信我还没有幸运地知道所有事情如何落入内存)。 这段代码实际上在做什么?

根据Python文档

创建具体数组类型的推荐方法是将任何ctypes数据类型乘以一个正整数。 或者,您可以将此类型子类化,并定义长度类型类变量。 数组元素可以使用标准下标和切片访问进行读写。 对于切片读取,结果对象本身不是数组。

例:

 >>> 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)
#                      ^^^^

创建的数组类型接受可变数量的元素,因此,您应该使用*x形式扩展列表x

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM