234

長さnのリストのリストを初期化するつもりです。

x = [[]] * n

ただし、これは何らかの形でリストをリンクします。

>>> x = [[]] * 3
>>> x[1].append(0)
>>> x
[[0], [0], [0]]

私は次のようなものを期待しています:

[[], [0], []]

何か案は?

4

1 に答える 1

366

問題は、それらがすべてメモリ内のまったく同じリストであることです。[x]*nこの構文を使用すると、n多くのxオブジェクトのリストが得られますが、それらはすべて同じオブジェクトへの参照です。それらは別個のインスタンスではなく、n同じインスタンスへの参照にすぎません。

3 つの異なるリストのリストを作成するには、次のようにします。

x = [[] for i in range(3)]

これにより、 の 3 つの個別のインスタンスが得られます。これ[]が必要です。

[[]]*nと類似しています

l = []
x = []
for i in range(n):
    x.append(l)

while[[] for i in range(3)]は次のようになります。

x = []
for i in range(n):
    x.append([])   # appending a new list!

In [20]: x = [[]] * 4

In [21]: [id(i) for i in x]
Out[21]: [164363948, 164363948, 164363948, 164363948] # same id()'s for each list,i.e same object


In [22]: x=[[] for i in range(4)]

In [23]: [id(i) for i in x]
Out[23]: [164382060, 164364140, 164363628, 164381292] #different id(), i.e unique objects this time
于 2012-10-09T01:03:12.927 に答える