2012-07-09 8 views
18

Pythonリストに異なるタイプを混在させると予期せぬ問題がありますか?たとえば:Pythonのリストで安全な混合型ですか?

import random 
data = [["name1", "long name1", 1, 2, 3], 
     ["name2", "long name2", 5, 6, 7]] 
name, long_name, int1, int2, int3 = random.choice(data) 

私はランダム関数内でいくつかの関連パラメータを設定するには、このコードを使用していますが、Pythonはそれをサポートしているにもかかわらず、私はリストにこのようなタイプの混合を警戒です。混合データ型のリストは、変数代入以外の処理(それが代入される変数ではなくリスト自体ではない)に使用されることはないので、これは問題ありませんが、これを確認したいと思います密かに問題のコードではありません。

+1

技術的な配列要素_are_すべて同じ型 - オブジェクトへの参照 –

+0

@gnibbler良い点。 –

答えて

24

いいえ、別の言語に格納されている1つのタイプのデータだけが必要な配列を持っていたときの "olden days"とは異なり、任意のタイプをlistに格納できます。

リストは他のオブジェクト参照と一緒に他のリストや他の複合データ構造も保存することができるので、リストを処理または反復することは可能な複数のレイヤーのために少し複雑になる可能性があります。シンプルな単一レベルの繰り返し。これはまたshallow and deep copyingに関連しています。

リストを処理するコードがこれを認識している場合、リスト内に異なるものを格納するこの機能に起因する問題は考えられません。

+0

ありがとうございます。データ型を格納できるのは知っていますが、早期に避けることができない問題はないことを確認したかったのです。 –

+3

@RicardoAltamiranoは、コード処理リストでは、リスト自体または他のデータ構造を含むことができるため、これを考慮する必要があるという唯一の問題があります。そうでなければ、私はこれに関する問題を考えることはできません。 – Levon

+0

「データ」リストを処理するコードはすべてそこにあります。 'random.choice'以上のもので、私が知る限り正しく処理する必要があります。 –

6

リストに複数のデータ型を持つことに固有の問題はありません。もちろん、そのリストをすべて同じタイプにすると期待しているものに対しては、そのリストを使用しようとすると問題が発生する可能性があります。あなたの例では、これがあなたがやっているすべてのことであれば、それが問題になる方法はありません。ただし、リストの代わりにタプルを使用することも考えられます。慣習では、シーケンスの構成が固定されているときにタプルが使用されます。リストは、シーケンスに追加または削除するときに使用されます。

+0

それは私が考えたものですが、私はそれぞれの変数でリスト内のデータを別々に使用しているので、それは害を及ぼすとは思わなかった。 –

9

リストの型を混在させると言語は問題ありませんが、Pythonの文化が嫌になるかもしれません。タプルは、既知の混合型のコレクションがあり、異なるインデックスが異なるセマンティクスを持つ場合に通常使用されます。リストは通常​​、さまざまな長さの一様なシーケンスがある場所で使用されます。

だからあなたのデータは、より従来のように表すことになります。もっと簡潔に言えば

data = [ 
    ("name1", "long name1", 1, 2, 3), 
    ("name2", "long name2", 5, 6, 7), 
    ... 
] 

:タプルはCの構造体、Cアレイのようなリストのように使用されています。

+0

あなたのタプルが長いか、コードの多くの場所で使用されている場合は、代わりにクラスを定義して、その中の各位置にオブジェクトの名前を付けることができます。 –

関連する問題