1. ホーム
  2. パイソン

[解決済み] [Solved] リストのリストを初期化するコードは、なぜリスト同士をリンクしているように見えるのでしょうか?重複

2022-04-05 16:45:58

質問

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

x = [[]] * n

しかし、これではなぜかリストがつながってしまう。

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

みたいなのを期待してる。

[[], [0], []]

何かアイデアはありますか?

解決方法は?

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

3種類のリストを作るには、こうします。

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

これは、3つの別々のインスタンス [] これは、あなたが望むものです。

[[]]*n と似ています。

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

一方 [[] 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