回答編集履歴

3

修正

2019/12/27 18:48

投稿

hayataka2049
hayataka2049

スコア30933

test 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

スコア30933

test CHANGED
@@ -18,7 +18,11 @@
18
18
 
19
19
  ##### 結果の変更を考慮するなら
20
20
 
21
+ そのままだと各`[0, 0]`同士、`[1, 1]`同士、`[2, 2]`同士がすべて同じ`list`オブジェクトになりますから、`ans`の要素を更に書き換えたい場合は不都合があります。
22
+
23
+
24
+
21
- そのままだとべて同じオブジェクトを参照しますから、コピーしてあげます。
25
+ これを解消るには子リストをコピーしてあげます。
22
26
 
23
27
 
24
28
 

1

追記

2019/12/27 05:09

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -13,3 +13,51 @@
13
13
  ans = [x for x in test for _ in range(3)]
14
14
 
15
15
  ```
16
+
17
+
18
+
19
+ ##### 結果の変更を考慮するなら
20
+
21
+ そのままだとすべて同じオブジェクトを参照しますから、コピーしてあげます。
22
+
23
+
24
+
25
+ ```python
26
+
27
+ >>> test = [[i, i] for i in range(3)]
28
+
29
+ >>> ans = [x for x in test for _ in range(3)]
30
+
31
+ >>> ans
32
+
33
+ [[0, 0], [0, 0], [0, 0], [1, 1], [1, 1], [1, 1], [2, 2], [2, 2], [2, 2]]
34
+
35
+ >>> ans[0][0] = 1
36
+
37
+ >>> ans
38
+
39
+ [[1, 0], [1, 0], [1, 0], [1, 1], [1, 1], [1, 1], [2, 2], [2, 2], [2, 2]]
40
+
41
+ >>> test = [[i, i] for i in range(3)]
42
+
43
+ >>> ans = [x.copy() for x in test for _ in range(3)]
44
+
45
+ >>> ans
46
+
47
+ [[0, 0], [0, 0], [0, 0], [1, 1], [1, 1], [1, 1], [2, 2], [2, 2], [2, 2]]
48
+
49
+ >>> ans[0][0] = 1
50
+
51
+ >>> ans
52
+
53
+ [[1, 0], [0, 0], [0, 0], [1, 1], [1, 1], [1, 1], [2, 2], [2, 2], [2, 2]]
54
+
55
+ ```
56
+
57
+
58
+
59
+ 参考:
60
+
61
+ [なぜ 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)
62
+
63
+ [多次元のリストを作るにはどうしますか? プログラミング FAQ — Python 3.8.1 ドキュメント](https://docs.python.org/ja/3/faq/programming.html#how-do-i-create-a-multidimensional-list)