Pythonで最初に指定した数の要素を持つリストを作りたかったけど、ハマったのでφ(..)メモメモ
試して載せているのはPython2.7での結果ですが、Python3.6でも同じ結果でした。

いつもは、次のようにコードを書いて作ってます(・_・;)


>>> test_list = [0] * 10

>>> print test_list
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

これで指定した数の要素数(10コ)を持つリストが作れました!

でも、今回私が作りたかったのは空のリストを10コ持つリスト。(二次元配列)
だから、こうしてみました!


>>> test_list = [[]] * 10

>>> print test_list
[[], [], [], [], [], [], [], [], [], []]

これで出来た!と思ったらなんか挙動がおかしい(´・ω・`)(´・ω・`)(´・ω・`)

調べて見るとこんなんなってた!


>>> test_list = [[]] * 10

>>> print test_list
[[], [], [], [], [], [], [], [], [], []]

>>> test_list[0].append(1)

>>> print test_list
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]

えっ?えっ?最初の要素にappendしたから、最初の要素だけ1が追加されるんじゃないの??

同じインスタンスを参照してる?のかな?いつもの作り方は実は間違ってる??

確かめてみると、


>>> test_list = [0] * 10

>>> print test_list
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

>>> test_list[0] = 1

>>> print test_list
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]

間違ってないみたいです。

うむ。よくわからない(・_・;)

とりあえず、二次元配列を作るときは違う書き方をしないと駄目みたいですね


>>> for i in range(10):
...     test_list.append([])
... 

>>> print test_list
[[], [], [], [], [], [], [], [], [], []]

>>> test_list[1].append(0)

>>> print test_list
[[], [0], [], [], [], [], [], [], [], []]

これならいい感じ!


細かい話はここに載ってました\(^o^)/

https://note.nkmk.me/python-list-initialize/

Categories:

Tags:

No responses yet

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA