回答編集履歴
1
引用追記
answer
CHANGED
@@ -1,3 +1,33 @@
|
|
1
1
|
多重リストの作り方にそもそも問題がありそうですね。問題なく作れていれば質問文のやり方で立派に成功します。
|
2
2
|
|
3
|
+
|
4
|
+
> このようにして多次元の配列を作ろうとしてしまったことがあるでしょう:
|
5
|
+
> ```
|
6
|
+
> >>>
|
7
|
+
> >>> A = [[None] * 2] * 3
|
8
|
+
> ```
|
9
|
+
> これを表示したときには問題なさそうに見えます:
|
10
|
+
> ```
|
11
|
+
> >>> A
|
12
|
+
> [[None, None], [None, None], [None, None]]
|
13
|
+
> ```
|
14
|
+
> しかし値を代入すると、その値が複数の場所に現れてしまいます:
|
15
|
+
> ```
|
16
|
+
> >>> A[0][0] = 5
|
17
|
+
> >>> A
|
18
|
+
> [[5, None], [5, None], [5, None]]
|
19
|
+
> ```
|
20
|
+
> これは、* を使ったリストの複製がコピーを作らず、存在するオブジェクトへの参照を作るだけだからです。この *3 は長さ 2 の同じリストへの参照を含むリストを作ります。一つの列に対する変更はすべての列に現れますが、これが望んだ結果であることはまずないでしょう。
|
21
|
+
>
|
22
|
+
> おすすめの方法は、最初に望んだ長さのリストを作り、それから新しく作ったリストでそれぞれの要素を埋めていくことです:
|
23
|
+
> ```
|
24
|
+
> A = [None] * 3
|
25
|
+
> for i in range(3):
|
26
|
+
> A[i] = [None] * 2
|
27
|
+
> ```
|
28
|
+
> これは長さ 2 の異なるリスト 3 つを含むリストを生成します。リスト内包表記も使えます:
|
29
|
+
> ```
|
30
|
+
> w, h = 2, 3
|
31
|
+
> A = [[None] * w for i in range(h)]
|
32
|
+
> ```
|
3
|
-
[多次元のリストを作るにはどうしますか? | プログラミング FAQ — Python 3.8.0 ドキュメント](https://docs.python.org/ja/3/faq/programming.html#how-do-i-create-a-multidimensional-list)
|
33
|
+
> [多次元のリストを作るにはどうしますか? | プログラミング FAQ — Python 3.8.0 ドキュメント](https://docs.python.org/ja/3/faq/programming.html#how-do-i-create-a-multidimensional-list)
|