2012-03-03 6 views
0

オブジェクトのリストのリストを適切に宣言する方法を理解しようとしています。 [0] [1]継続ユーザ1、ユーザのために0に関連する情報、super_listを含有する他のリストの一部のリストであることを意図しPythonでカスタムオブジェクトのリストのリスト

short_list = [] * 5 
for in range(5): 
    c = MyClass() 
    short_list.append(c) 

super_list = [[short_list] * 100] * number_of_users 

super_list次のPythonコードを考えます。これらのリストは、最終的にタイプ「MyClass」のオブジェクトのグループを編成します。私の問題は、super_list [0]内のlist要素の値を設定すると、super_list [1]の対応するリスト要素も変更されることです。 super_list [0]とsuper_list [1]は常に同じです。

super_list [0]とsuper_list [1]が2つの別々のリストとして動作するように、私が達成しようとしているリストの概念的な構成を私に与えるためにshort_listやsuper_listを宣言するにはどうすればよいですか?

答えて

0

あなたはそれらを手動で構成する必要があります。

super_list = [] 
for i in xrange(100): 
    short_list = [] 
    for j in xrange(5): 
     short_list.append(MyClass()) 
    super_list.append(short_list) 

あるいは、短く、多分あまり読みものの:

super_list = [[MyClass() for j in xrange(5)] for i in xrange(100)] 
0

[] * 5パイソン(対話インタプリタやIPythonでそれをしようで[]に等しく、 )。

コピースーパーリストを作成するときのリスト。デフォルトでは、リストを割り当てることで(*演算子の背後にある)、新しい参照のみが作成されます。これを代わりに試してください:

[ short_list[:] for stub in xrange(100) ] 

これは、スライス構文を使用して何度もリストをクローンします。それはリストを浅くコピーするPythonの方法です。

ディープコピーが必要な場合はimport copyとし、方法はdeepcopyです。

+0

まだsuper_list [0] [0]はsuper_list [1] [0] 'ですが、super_list [0]はsuper_list [1]です問題を解決しました。 – icktoofay

+0

本当にありがとうございます。私はOPの質問から深いコピーが必要ではないことを知りましたが、deepcopyのコメントを追加しました。 –

関連する問題