2012-05-11 8 views
0

Pythonは、[1、 "two"、3]という異なるデータ型のリストを持つことができます。 PythonはC言語で実装されていたので、C言語を使用して異なるデータ型の配列を作成するにはどうすればよいでしょうか?Pythonはどのように配列内のデータ型が異なりますか?

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

今、あなたは限り、あなたはポインタツーcharとしてそれらを表現することができますよう、データの任意のタイプを含むことができ、配列を持っている:あなたの配列は、フォームのCの構造体で構成されている場合は何

+0

Pythonを実装してから使用します。真剣に、これを試してはいけない。あなたがすべての型を書く必要があるCのような*言語を使用している*理由は、コンパイル時にすべての型を判別できるようにするためです。これは、完全に無駄な場合を除いて、混合型のリストでは不可能です(実際には 'struct'が必要です)、すべての型を書く必要があります。実行時のリスト*および*は、例外を取得する代わりに間違っている場合、未定義の動作を取得します。あらゆる世界の最悪。 –

+1

@ user1163114:理由を説明してください。あなたの目標を達成するためのC-ishの方法がおそらくあります。 –

答えて

3

もちろん、これはPythonのやり方ではありません。要点は、アプリケーションのデータ処理方法と、実装言語がデータを処理する方法との間に何らかの関連性がないことです。

4

私はPythonでどのように実装されているのか分かりませんが、Cでは汎用データを操作する方法があります。その最も単純な形式で:

​​

今、あなたはvoid*の完全な配列を持っています。それぞれvoid*は何かを指すことができます。あなたはそれが指しているもののサイズを伝えるためにいくつかの余分な情報が必要になります。

必要に応じてさまざまな方法で実際のタイプを表すことができます。共用体を使用すると、N個の型のうちの1つを同じ変数に保持できます。とにかく、Cのジェネリックデータを操作する方法はさまざまです。

3

どのようにしてcで異なるデータ型の配列を作成できますか?

できません。 Cは静的型言語です。

ただし、労働組合のようなものを使用することができます。

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


Foo array[3]; 

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

また、あなたは好きなオブジェクトを指すようにvoid *を使用することができますが、これは慎重なメモリ管理が必要です。

0

Pythonでは、「生の」値はありません。すべてがオブジェクトであり、その型を知っています。整数もオブジェクトです((1).__class__または1 .__class__を印刷してみてください)。 Pythonオブジェクトを使用してCで行うすべての操作は、PyObject *(オブジェクトへのポインタ)を介して行います。

Python listは、PyObject *の動的(つまりサイズ変更可能な)配列です。すべてのオブジェクトは型を知っているので、listは特定の型のメンバーを持つと宣言する必要はありません。

¹参考:Pythonには、型付き変数に値が含まれている通常の意味(C、BASIC、Pascalなど)の「変数」はありません。それは名前空間と名前を持っています(実際には文字列をオブジェクトにマッピングする辞書、名前空間は辞書です、そのキーは名前、その値は各名前が指すオブジェクトへのポインタです)。

関連する問題