Python は、[1,"two",3] など、さまざまなデータ型のリストを持つことができます。Python は c で実装されましたが、c を使用して異なるデータ型の配列を作成するにはどうすればよいでしょうか?
4 に答える
したがって、Python でどのように実装されているかはわかりませんが、C では一般的なデータを操作する方法があります。最も単純な形式で:
void *array[size];
これで、配列がいっぱいになりvoid*
ました。それぞれvoid*
は何でも指すことができます。それが指すもののサイズを伝えるために、いくつかの追加情報も必要です。
typedef struct {
void *data;
size_t size;
} elem;
必要に応じて、さまざまな方法で実際の型を表すことができます。共用体を使用して、同じ変数に N 型のいずれかを保持できます。とにかく、ポイントは、C で一般的なデータを操作するさまざまな方法があるということです。
配列が次の形式の C 構造体で構成されている場合はどうなるでしょうか。
struct slot {
int type;
char *data;
};
これで、char へのポインターとして表現できる限り、任意の型のデータを含むことができる配列ができました。
もちろん、これは Python のやり方ではありません。重要なのは、アプリケーションがデータを処理する方法と、実装言語がデータを処理する方法との間に関連性がある必要はないということです。
cを使用して、さまざまなデータ型の配列を作成するにはどうすればよいですか?
できません; C は静的型付け言語です。
ただし、ユニオンなどを使用できます。
typedef union {
int i;
float f;
} Foo;
Foo array[3];
array[0].i = 3;
array[1].f = 4.2;
...
を使用void *
して任意のオブジェクトを指すこともできますが、これには注意深いメモリ管理が必要です。
Python には、「生の」値はありません。すべてがオブジェクトであり、その型を知っています。整数でさえオブジェクトです ((1).__class__
またはを印刷してみてください1 .__class__
)。Python オブジェクトを使用して C で行うことはすべて、PyObject *
(オブジェクトへのポインター) を介して行います。¹
Pythonlist
は、動的な (サイズ変更可能な) 配列ですPyObject *
。すべてのオブジェクトはその型を認識してlist
いるため、特定の型のメンバーを持つと宣言する必要はありません。
¹ 注意: Python には通常の意味 (C、BASIC、Pascal など) の「変数」がありません。型付き変数には値が含まれます。名前空間と名前があります (実際には、文字列をオブジェクトにマッピングする辞書です。名前空間は辞書であり、そのキーは名前であり、その値は各名前が指すオブジェクトへのポインターです)。