python如何在数组中具有不同的数据类型?

python如何在数组中具有不同的数据类型?,python,c,arrays,Python,C,Arrays,Python可以有一个包含不同数据类型的列表,即[1,“2”,3]。Python是用c实现的,那么如何使用c创建一个包含不同数据类型的数组呢 如果数组由以下形式的C结构组成,该怎么办: struct slot { int type; char *data; }; 现在您有了一个可以包含任意类型数据的数组,只要您可以将它们表示为指向char的指针 当然,这不是Python的工作方式;关键是,应用程序处理数据的方式与实现语言处理数据的方式之间不必存在任何联系。如果数组由以下形式的C结构组成

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

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

struct slot {
  int type;
  char *data;
};
现在您有了一个可以包含任意类型数据的数组,只要您可以将它们表示为指向char的指针


当然,这不是Python的工作方式;关键是,应用程序处理数据的方式与实现语言处理数据的方式之间不必存在任何联系。

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

struct slot {
  int type;
  char *data;
};
现在您有了一个可以包含任意类型数据的数组,只要您可以将它们表示为指向char的指针


当然,这不是Python的工作方式;关键是,应用程序处理数据的方式与实现语言处理数据的方式之间不必有任何联系。

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

void *array[size];
现在您有了一个充满
void*
的数组。每个
void*
都可以指向任何东西。您还需要一些额外的信息来告诉您它所指向的对象的大小

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

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

因此,我不知道它在Python中是如何实现的,但在C中有多种方法可以对泛型数据进行操作。以最简单的形式:

void *array[size];
现在您有了一个充满
void*
的数组。每个
void*
都可以指向任何东西。您还需要一些额外的信息来告诉您它所指向的对象的大小

typedef struct {
    void *data;
    size_t size;
} elem;
如果需要,可以通过多种方法表示实际类型。可以使用联合在同一变量中保存N种类型中的一种。无论如何,关键是在C语言中有多种方法可以对通用数据进行操作

如何使用c创建包含不同数据类型的数组

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

但是,您可以使用诸如联合之类的方法:

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


Foo array[3];

array[0].i = 3;
array[1].f = 4.2;
...
您还可以使用
void*
指向任何您喜欢的对象,但这需要仔细的内存管理

如何使用c创建包含不同数据类型的数组

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

但是,您可以使用诸如联合之类的方法:

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


Foo array[3];

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

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

在Python中,没有“原始”值;一切都是一个对象,都知道它的类型。偶数整数是对象(请尝试打印
(1)。\uuuuu class\uuuuuu
1.\uuuu class\uuuu
)。在C语言中使用Python对象所做的一切,都是通过
PyObject*
(指向对象的指针)来完成的。ª

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


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

在Python中,没有“原始”值;一切都是一个对象,都知道它的类型。偶数整数是对象(请尝试打印
(1)。\uuuuu class\uuuuuu
1.\uuuu class\uuuu
)。在C语言中使用Python对象所做的一切,都是通过
PyObject*
(指向对象的指针)来完成的。ª

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


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

通过实现然后使用Python。说真的,别这样。您使用像C这样的语言(必须写出所有内容的类型)的全部原因是,所有内容的类型都可以在编译时确定。对于混合类型列表来说,这是不可能的,除非是在完全无用的情况下(在这种情况下,您真的需要一个
结构
),因此您最终必须为所有内容编写类型,并编写代码,在运行时找出列表中的内容类型,如果您出错,则获得未定义的行为,而不是获得异常。世界上最糟糕的事情。@user1163114:请解释你为什么要这样做。可能有一种更像C语言的方式来实现您的目标,即实现并使用Python。说真的,别这样。您使用像C这样的语言(必须写出所有内容的类型)的全部原因是,所有内容的类型都可以在编译时确定。对于混合类型列表来说,这是不可能的,除非是在完全无用的情况下(在这种情况下,您真的需要一个
结构
),因此您最终必须为所有内容编写类型,并编写代码,在运行时找出列表中的内容类型,如果您出错,则获得未定义的行为,而不是获得异常。世界上最糟糕的事情。@user1163114:请解释你为什么要这样做。也许有一种更像C-ish的方式来实现你的目标。