【问题标题】:How does python have different data types in an array?python如何在数组中有不同的数据类型?
【发布时间】:2012-05-26 18:39:56
【问题描述】:

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

【问题讨论】:

  • 通过实现然后使用 Python。说真的,不要尝试这个。 您使用像 C 这样的语言的全部原因,您必须在其中写出所有内容的类型,以便可以在编译时确定所有内容的类型。这对于混合类型列表是不可能的,除非在完全无用的情况下(你真的想要一个struct),所以你最终不得不为所有东西编写类型编写代码来弄清楚什么是事物的类型在运行时在列表中并且如果你错了而不是得到异常会得到未定义的行为。世界上最糟糕的。
  • @user1163114:请解释为什么你想这样做。实现您的目标可能有更 C-ish 的方式。

标签: python c arrays


【解决方案1】:

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

void *array[size];

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

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

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

【讨论】:

    【解决方案2】:

    如果你的数组由以下形式的 C 结构组成:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      typedef union {
          int i;
          float f;
      } Foo;
      
      
      Foo array[3];
      
      array[0].i = 3;
      array[1].f = 4.2;
      ...
      

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2018-07-10
          • 1970-01-01
          • 1970-01-01
          • 2020-12-09
          • 2021-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多