回答編集履歴

5

修正

2017/11/01 03:00

投稿

toritoritorina
toritoritorina

スコア972

test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
  リストだけではなく、ミュータブルなオブジェクトであれば同様のことが起きます。クラスのインスタンスや辞書でも同じです。
42
42
 
43
- イミュータブルな、例えば数値等ではこれは起きません。
43
+ イミュータブルな、例えば数値等ではこれは起きません。(これは正確には、同名の変数を定義し直しているだけなので例としては不適切でした...)
44
44
 
45
45
  ```python
46
46
 

4

わかりやすくした

2017/11/01 03:00

投稿

toritoritorina
toritoritorina

スコア972

test CHANGED
@@ -10,33 +10,27 @@
10
10
 
11
11
  ```
12
12
 
13
+ 何が起きていたかというと、以下の例がわかりやすいと思います。
14
+
13
- リストのようなミュータブル(更可能)なオブジェクトをA_list[m] = copy_num として格納していくと、結局のところ以下のようになるわけです。
15
+ origin変数としてリストをつくり、それをa数に代入し、a_listにaを複数格納していす。
16
+
17
+ このとき、originと全てのaは同じものを指しています。
14
18
 
15
19
  ```python
16
20
 
17
- # 中身が全て同じものを指している!
21
+ >>> origin = [1, 2, 3, 4, 5]
18
22
 
19
- A_list = [copy_num, copy_num, copy_num, copy_num, copy_num]
23
+ >>> a = origin
20
24
 
21
- ```
25
+ >>> a_list = (a, a, a, a, a) # originと全てのaは同じものを指している
22
26
 
23
- 全てのcopy_numが同じものを指しており、どこかのcopy_num(リストの外にあるものでも!)が変更されると他の全てのcopy_numも影響を受けます。これはリストだけではなく、ミュータブルなオブジェクトは全て同様のことが起きるので気をつけてください。
24
-
25
- もう少し分かりやすい例だと、以下のようなことがおきます。
26
-
27
- ```python
28
-
29
- >>> a = [1, 2, 3, 4, 5]
30
-
31
- >>> b = (a, a, a, a, a) # 全てのaは同じものを指している
32
-
33
- >>> b
27
+ >>> a_list
34
28
 
35
29
  ([1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5])
36
30
 
37
- >>> a[4] = 10000
31
+ >>> origin[4] = 10000
38
32
 
39
- >>> b
33
+ >>> a_list
40
34
 
41
35
  ([1, 2, 3, 4, 10000], [1, 2, 3, 4, 10000], [1, 2, 3, 4, 10000], [1, 2, 3, 4, 10000], [1, 2, 3, 4, 10000])
42
36
 
@@ -44,31 +38,33 @@
44
38
 
45
39
  ```
46
40
 
41
+ リストだけではなく、ミュータブルなオブジェクトであれば同様のことが起きます。クラスのインスタンスや辞書でも同じです。
42
+
47
43
  イミュータブルな、例えば数値等ではこれは起きません。
48
44
 
49
45
  ```python
50
46
 
51
- >>> a = 1
47
+ >>> origin = 1
52
48
 
53
- >>> b = (a, a, a, a, a)
49
+ >>> a = origin
54
50
 
51
+ >>> a_list = (a, a, a, a, a)
52
+
55
- >>> b
53
+ >>> a_list
56
54
 
57
55
  (1, 1, 1, 1, 1)
58
56
 
59
- >>> a = 100
57
+ >>> origin = 10000
60
58
 
61
- >>> b
59
+ >>> a_list
62
60
 
63
61
  (1, 1, 1, 1, 1)
64
-
65
- >>>
66
62
 
67
63
 
68
64
 
69
65
  ```
70
66
 
71
- ミュータブルやイミュータブル等の難しい言葉を使っていますが、よく使うものであればリスト、辞書、クラスのインスタンスあたりがミュータブルなので、他変数に代入する際は少し気をつけてください。(特に、関数の引数指定際はハマりポイントです)
67
+ ミュータブルやイミュータブル等の難しい言葉を使っていますが、よく使うものであればリスト、辞書、クラスのインスタンスあたりがミュータブルなので、他変数に代入したりリストに複数格納する際は少し気をつけてください。(特に、関数の引数にミュータブルなオブジェクトを渡す際はハマりポイントです)
72
68
 
73
69
 
74
70
 
@@ -77,3 +73,41 @@
77
73
  list[:4]のようにリストのスライスをすると別のリストが作成され返されるんですが、それを応用し
78
74
 
79
75
  list[::]のようにすることで中身が同じな、別のリストを作成しました。
76
+
77
+ 他にもコピーを作る方法はいくつかあります。
78
+
79
+ ```python
80
+
81
+ # リストのコピーを作る方法
82
+
83
+ >>> a = [1, 2, 3]
84
+
85
+ >>> b = list(a)
86
+
87
+ >>> c = a.copy()
88
+
89
+ >>> d = a[::]
90
+
91
+
92
+
93
+ # id関数の値が違うならば、それらは別のオブジェクトと判断できます
94
+
95
+ >>> id(a)
96
+
97
+ 140676014804168
98
+
99
+ >>> id(b)
100
+
101
+ 140676014820232
102
+
103
+ >>> id(c)
104
+
105
+ 140676014819720
106
+
107
+ >>> id(d)
108
+
109
+ 140676014819464
110
+
111
+
112
+
113
+ ```

3

回りくどくなったので修正

2017/08/26 18:12

投稿

toritoritorina
toritoritorina

スコア972

test CHANGED
@@ -14,93 +14,21 @@
14
14
 
15
15
  ```python
16
16
 
17
- # 中身が全て同じオブジェクトを指している
17
+ # 中身が全て同じものを指している!
18
18
 
19
19
  A_list = [copy_num, copy_num, copy_num, copy_num, copy_num]
20
20
 
21
21
  ```
22
22
 
23
- で変更したコ
23
+ 全てのcopy_numが同じものを指しており、どこかのcopy_num(リストの外にあるものも!)が変更されると他の全てのcopy_numも影響を受けます。これはリストだけではなく、ミュタブルなオブジェクト全て同様のことが起きるので気をつけてください。
24
24
 
25
- list[:4]のようにリストのスライスをすると別のリストが作成され返されるんですが、それを応用し
26
-
27
- list[::]のようにすることで中身が同じな、別のリストを作成しました。
28
-
29
-
30
-
31
- 今回はリストでしたが、ミュータブルなオブジェクトならば全て同様のことが起こりえます。以下はクラスの場合のサンプルです
32
-
33
- ```python
34
-
35
- class A:
36
-
37
- def __init__(self):
38
-
39
- self.name = 'spam'
40
-
41
-
42
-
43
- A_list = []
44
-
45
-
46
-
47
- # aを作る。nameは'spam'のまま
48
-
49
- a = A()
50
-
51
- A_list.append(a)
52
-
53
-
54
-
55
- # bを作る。nameを'ham'にする
56
-
57
- b = a
58
-
59
- b.name = 'ham'
60
-
61
- A_list.append(b)
62
-
63
-
64
-
65
- # cを作る。nameを'egg'にする
66
-
67
- c = b
68
-
69
- c.name = 'egg'
70
-
71
- A_list.append(c)
72
-
73
-
74
-
75
- for obj in A_list:
76
-
77
- print(obj.name) # 'spam', 'ham', 'egg' が出力されてほしい
78
-
79
-
80
-
81
-
82
-
83
- ```
84
-
85
- 実際の出力
86
-
87
- ```
88
-
89
- egg
90
-
91
- egg
92
-
93
- egg
94
-
95
- ```
96
-
97
- 似たようなサンプルをもう一つ貼っておきます。
25
+ もう少し分かりやすい例だと、以下のようなことがおきます。
98
26
 
99
27
  ```python
100
28
 
101
29
  >>> a = [1, 2, 3, 4, 5]
102
30
 
103
- >>> b = (a, a, a, a, a)
31
+ >>> b = (a, a, a, a, a) # 全てのaは同じものを指している
104
32
 
105
33
  >>> b
106
34
 
@@ -114,54 +42,38 @@
114
42
 
115
43
  >>>
116
44
 
45
+ ```
46
+
47
+ イミュータブルな、例えば数値等ではこれは起きません。
48
+
49
+ ```python
50
+
51
+ >>> a = 1
52
+
53
+ >>> b = (a, a, a, a, a)
54
+
55
+ >>> b
56
+
57
+ (1, 1, 1, 1, 1)
58
+
59
+ >>> a = 100
60
+
61
+ >>> b
62
+
63
+ (1, 1, 1, 1, 1)
64
+
65
+ >>>
66
+
117
67
 
118
68
 
119
69
  ```
120
70
 
121
- イミュータブル(変更不能)な数値等のオブジェクトであれば問題ないです
71
+ ミュータブルやイミュータブル等の難しい言葉を使っていますが、よく使うものであればリスト、辞書、クラスのインスタンスあたりがミュータブルので、他変数に代入する際は少し気をつけてくださ。(特に、関数の引数等に指定する際はハマりポイントです
122
-
123
- ```python
124
-
125
- A_list = []
126
72
 
127
73
 
128
74
 
129
- a = 1
75
+ 一番上で変更したコードは、
130
76
 
131
- A_list.append(a)
77
+ list[:4]のようにリストのスライスをすると別のリストが作成され返されるんですが、それを応用し
132
78
 
133
-
134
-
135
- b = a
136
-
137
- b = 2
138
-
139
- A_list.append(b)
140
-
141
-
142
-
143
- c = b
144
-
145
- c = 3
146
-
147
- A_list.append(c)
148
-
149
-
150
-
151
- for num in A_list:
152
-
153
- print(num) # 1, 2, 3 表示されてほ
79
+ list[::]のようにするこで中身が同じな、別のリストを作成ました。
154
-
155
- ```
156
-
157
- 上手く動く!
158
-
159
- ```python
160
-
161
- 1
162
-
163
- 2
164
-
165
- 3
166
-
167
- ```

2

追記

2017/08/26 17:51

投稿

toritoritorina
toritoritorina

スコア972

test CHANGED
@@ -94,6 +94,30 @@
94
94
 
95
95
  ```
96
96
 
97
+ 似たようなサンプルをもう一つ貼っておきます。
98
+
99
+ ```python
100
+
101
+ >>> a = [1, 2, 3, 4, 5]
102
+
103
+ >>> b = (a, a, a, a, a)
104
+
105
+ >>> b
106
+
107
+ ([1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5])
108
+
109
+ >>> a[4] = 10000
110
+
111
+ >>> b
112
+
113
+ ([1, 2, 3, 4, 10000], [1, 2, 3, 4, 10000], [1, 2, 3, 4, 10000], [1, 2, 3, 4, 10000], [1, 2, 3, 4, 10000])
114
+
115
+ >>>
116
+
117
+
118
+
119
+ ```
120
+
97
121
  イミュータブル(変更不能)な数値等のオブジェクトであれば問題ないです。
98
122
 
99
123
  ```python

1

誤解を招く表現の修正

2017/08/26 17:39

投稿

toritoritorina
toritoritorina

スコア972

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  ```
12
12
 
13
- A_list[m] = copy_num として格納していくと、結局のところ以下のようになるわけです。
13
+ リストのようなミュータブル(変更可能)なオブジェクトをA_list[m] = copy_num として格納していくと、結局のところ以下のようになるわけです。
14
14
 
15
15
  ```python
16
16
 
@@ -28,7 +28,7 @@
28
28
 
29
29
 
30
30
 
31
- 今回はリストでしたが、いわゆるミュータブル(変更可能)なオブジェクトならば全て同様のことが起こりえます。以下はクラスの場合のサンプルです
31
+ 今回はリストでしたが、ミュータブルなオブジェクトならば全て同様のことが起こりえます。以下はクラスの場合のサンプルです
32
32
 
33
33
  ```python
34
34
 
@@ -93,3 +93,51 @@
93
93
  egg
94
94
 
95
95
  ```
96
+
97
+ イミュータブル(変更不能)な数値等のオブジェクトであれば問題ないです。
98
+
99
+ ```python
100
+
101
+ A_list = []
102
+
103
+
104
+
105
+ a = 1
106
+
107
+ A_list.append(a)
108
+
109
+
110
+
111
+ b = a
112
+
113
+ b = 2
114
+
115
+ A_list.append(b)
116
+
117
+
118
+
119
+ c = b
120
+
121
+ c = 3
122
+
123
+ A_list.append(c)
124
+
125
+
126
+
127
+ for num in A_list:
128
+
129
+ print(num) # 1, 2, 3 と表示されてほしい
130
+
131
+ ```
132
+
133
+ 上手く動く!
134
+
135
+ ```python
136
+
137
+ 1
138
+
139
+ 2
140
+
141
+ 3
142
+
143
+ ```