1

Python 中可以有一个包含不同数据类型的列表,即 [1,"two",3]。Python 是用 c 实现的,那么如何使用 c 创建一个包含不同数据类型的数组呢?

4

4 回答 4

4

所以,我不知道它是如何在 Python 中实现的,但是在 C 中,有一些方法可以对通用数据进行操作。以最简单的形式:

void *array[size];

现在你有一个完整的数组void*。每个都void*可以指向任何东西。您还需要一些额外的信息来告诉您它所指向的事物的大小。

typedef struct {
    void *data;
    size_t size;
} elem;

如果需要,您可以通过各种方法表示实际类型。您可以使用联合将 N 类型之一保存在同一变量中。无论如何,关键是在 C 语言中有多种方法可以对通用数据进行操作。

于 2012-05-11T21:12:00.990 回答
3

如何使用 c 创建一个具有不同数据类型的数组?

你不能;C 是一种静态类型语言。

但是,您可以使用联合之类的东西:

typedef union {
    int i;
    float f;
} Foo;


Foo array[3];

array[0].i = 3;
array[1].f = 4.2;
...

你也可以用它void *来指向你喜欢的任何对象,但这需要仔细的内存管理。

于 2012-05-11T21:12:22.053 回答
3

如果您的数组由以下形式的 C 结构组成怎么办:

struct slot {
  int type;
  char *data;
};

现在您有了一个可以包含任意类型数据的数组,只要您可以将它们表示为指向字符的指针。

当然,这不是 Python 的做法。关键是,您的应用程序如何处理数据与您的实现语言如何处理数据之间不必有任何联系。

于 2012-05-11T21:11:41.540 回答
1

在 Python 中,没有“原始”值;一切都是对象并且知道它的类型。甚至整数也是对象(尝试打印(1).__class__1 .__class__)。你在 C 语言中对 Python 对象所做的一切,都是通过一个PyObject *(指向对象的指针)来完成的。¹

Pythonlist是一个动态的(即可调整大小的)数组PyObject *。由于每个对象都知道其类型,因此list不必将其声明为具有特定类型的成员。

¹ 另请注意:Python 没有通常意义上的“变量”(C、BASIC、Pascal 等),其中类型变量包含值;它具有命名空间和名称(实际上,字典将字符串映射到对象;命名空间是一个字典,它的键是名称,它的值是指向每个名称所指向的对象的指针)。

于 2012-05-26T10:23:08.767 回答