49

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はそれをサポートしていますが、リストにこのような型を混在させることには注意が必要です。混合データ型のリストは、変数の割り当て自体(リスト自体ではなく、割り当てられる変数)以外の処理には使用されないため、これで問題ないと思いますが、これを確認したいと思います。密かに問題のあるコードではありません。

4

4 に答える 4

61

問題ありません。他の言語に1つのタイプのデータのみを格納する配列があった「昔」とは異なり、リスト内に任意のタイプを格納できます。

リストは他のリストや他の複合データ構造を他のオブジェクト参照とともに格納することもできるため、リストの処理や反復は、単純な単一レベルの反復で配列を通過するよりも、複数のレイヤーが存在する可能性があるため、少し複雑になる可能性があります。 。これは、浅いコピーと深いコピーにも関連しています。

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

于 2012-07-09T00:10:54.313 に答える
19

この言語は、リストに型を混在させることで問題ありませんが、Pythonの文化がそれに眉をひそめる可能性があることを知っておく必要があります。タプルは通常、混合型の既知のコレクションがあり、インデックスが異なればセマンティクスも異なる場合に使用されます。リストは通常​​、さまざまな長さの均一なシーケンスがある場合に使用されます。

したがって、データは通常、次のように表されます。

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

より簡潔に言えば、タプルはC構造体のように使用され、リストはC配列のように使用されます。

于 2012-07-09T01:13:45.020 に答える
8

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

于 2012-07-09T00:11:12.090 に答える
1

これを単に使用して、関数のコントラクトに従っているさまざまな可能な出力を格納している場合はname, long_name, int1, int2, int3、問題ありません。

これがリスト内のタイプとその順序を知らない他のコードによって使用されている場合、問題が発生します。簡単な例:

>>> min(['-2', 1])
1
于 2018-04-03T05:31:19.000 に答える