teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

修正

2019/12/27 18:48

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -1,4 +1,4 @@
1
- 内側のforが回る回数は定数なので、計算量的にはO(N)になり、そのロジックやり方大きな問題はありません。
1
+ 内側のforが回る回数は定数なので、計算量的にはO(N)になり、そのロジックで大きな問題はありません。
2
2
 
3
3
  二重内包表記だときもち程度短くて綺麗です。
4
4
 

2

説明を丁寧に

2019/12/27 18:48

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -8,8 +8,10 @@
8
8
  ```
9
9
 
10
10
  ##### 結果の変更を考慮するなら
11
- そのままだとすべて同じオブジェクトを参照しますから、コピーしてます。
11
+ そのままだと各`[0, 0]`同士、`[1, 1]`同士、`[2, 2]`同士がすべて同じ`list`オブジェクトになりますから、`ans`の要素を更に書き換えたい場合は不都合がます。
12
12
 
13
+ これを解消するには子リストをコピーしてあげます。
14
+
13
15
  ```python
14
16
  >>> test = [[i, i] for i in range(3)]
15
17
  >>> ans = [x for x in test for _ in range(3)]

1

追記

2019/12/27 05:09

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -5,4 +5,28 @@
5
5
  ```python
6
6
  test = [[i, i] for i in range(3)]
7
7
  ans = [x for x in test for _ in range(3)]
8
- ```
8
+ ```
9
+
10
+ ##### 結果の変更を考慮するなら
11
+ そのままだとすべて同じオブジェクトを参照しますから、コピーしてあげます。
12
+
13
+ ```python
14
+ >>> test = [[i, i] for i in range(3)]
15
+ >>> ans = [x for x in test for _ in range(3)]
16
+ >>> ans
17
+ [[0, 0], [0, 0], [0, 0], [1, 1], [1, 1], [1, 1], [2, 2], [2, 2], [2, 2]]
18
+ >>> ans[0][0] = 1
19
+ >>> ans
20
+ [[1, 0], [1, 0], [1, 0], [1, 1], [1, 1], [1, 1], [2, 2], [2, 2], [2, 2]]
21
+ >>> test = [[i, i] for i in range(3)]
22
+ >>> ans = [x.copy() for x in test for _ in range(3)]
23
+ >>> ans
24
+ [[0, 0], [0, 0], [0, 0], [1, 1], [1, 1], [1, 1], [2, 2], [2, 2], [2, 2]]
25
+ >>> ans[0][0] = 1
26
+ >>> ans
27
+ [[1, 0], [0, 0], [0, 0], [1, 1], [1, 1], [1, 1], [2, 2], [2, 2], [2, 2]]
28
+ ```
29
+
30
+ 参考:
31
+ [なぜ list 'y' を変更すると list 'x' も変更されるのですか? プログラミング FAQ — Python 3.8.1 ドキュメント](https://docs.python.org/ja/3/faq/programming.html#why-did-changing-list-y-also-change-list-x)
32
+ [多次元のリストを作るにはどうしますか? プログラミング FAQ — Python 3.8.1 ドキュメント](https://docs.python.org/ja/3/faq/programming.html#how-do-i-create-a-multidimensional-list)