回答編集履歴

1

詳細な説明追加

2015/12/04 03:54

投稿

hiro-k
hiro-k

スコア902

test CHANGED
@@ -1 +1,87 @@
1
1
  A.append(A[-1]) の代わりに、 A.append(list(A[-1])) とすれば望みの動作になりますよ。
2
+
3
+
4
+
5
+ --追記--
6
+
7
+
8
+
9
+ ```python
10
+
11
+ a=[1,1,1]
12
+
13
+ b=a
14
+
15
+ a[2]=5
16
+
17
+ print a,b
18
+
19
+ ```
20
+
21
+ とすると、[1,1,5] [1,1,5] と表示されるかと思います。一方
22
+
23
+ ```python
24
+
25
+ c=[1,1,1]
26
+
27
+ d=[1,1,1]
28
+
29
+ c[2]=5
30
+
31
+ print c,d
32
+
33
+ ```
34
+
35
+ なら [1,1,5] [1,1,1] になるはずです。
36
+
37
+ ```python
38
+
39
+ e=[1,1,1]
40
+
41
+ f=list(e)
42
+
43
+ c[2]=5
44
+
45
+ print e,f
46
+
47
+ ```
48
+
49
+ も [1,1,5] [1,1,1] になるはずです。
50
+
51
+ 上記例では a と b には同じ実体のリストが入っているのに対して
52
+
53
+ cとd には別のリスト(ただし内容は同じ)が入っているということです。
54
+
55
+ list(e) というのは内容が同じだけど別実体のリストを新たに作ることになるため、
56
+
57
+ c,d と e,f は同じ結果になります。
58
+
59
+
60
+
61
+ 提示された例を少し書き換えてみます。
62
+
63
+ ```python
64
+
65
+ a = [1,1,1]
66
+
67
+ A = [ a ]
68
+
69
+ A.append(A[-1]) #直前の要素をコピー。
70
+
71
+ A[-1][2] = 5 #コピーしてできた要素を一部書き換える。コピー元要素は書き換わってほしくない。
72
+
73
+ a[1]=3
74
+
75
+ print A
76
+
77
+ ```
78
+
79
+ とすると、 [[1,3,5],[1,3,5]]と表示されるかと 思います。
80
+
81
+
82
+
83
+ つまり、この例では、a も A[0] も後から追加した A[1] も同じ一つの実体のリストを指しているということです。
84
+
85
+
86
+
87
+