🤙

Python3の二重Listを初期化するときに気をつけること

2023/08/24に公開

Python初心者です。

最近競プロに興味を持ってコーディング問題を解いていたのですが、ListをListで初期化する際に気づいたことがありまとめます。

参考コード

sampleList = [[]]*10
print(sampleList)
# [[], [], [], [], [], [], [], [], [], []] 
sampleList[0].append(1)
print(sampleList)
# [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]

気づき

上記の形[[]]*10のように初期化されたListオブジェクトは同じメモリを参照することが挙動でわかりました。
これを回避する方法としては色々ありますが一例として、下記があります。

sampleList = [[] for i in range(10)]
print(sampleList)
# [[], [], [], [], [], [], [], [], [], []]
sampleList[0].append(1)
print(sampleList)
# [[1], [], [], [], [], [], [], [], [], []]

これで、それぞれのListオブジェクトを別メモリ上に初期化することが出来ました。

まとめ

初期化のやり方によっては挙動が変わることを早めに気づけてよかったです。
ソースコードレベルで見てみようと思って、コードを見てみましたが、今のところ該当箇所は突き止められてないです:(

該当箇所が分かれば追記をしようと思います。

間違っている点等あればコメントいただけますと幸いです。
以上、最後まで読んでいただきありがとうございました!

Discussion