回答編集履歴

7

追記

2021/02/13 14:04

投稿

LouiS0616
LouiS0616

スコア35668

test CHANGED
@@ -263,3 +263,17 @@
263
263
  )
264
264
 
265
265
  ```
266
+
267
+
268
+
269
+ 更には
270
+
271
+ ```Python
272
+
273
+ def abc(price):
274
+
275
+ n = 3
276
+
277
+ return n*(price-1) + (n*(n-1)//2)
278
+
279
+ ```

6

追記

2021/02/13 14:04

投稿

LouiS0616
LouiS0616

スコア35668

test CHANGED
@@ -52,6 +52,10 @@
52
52
 
53
53
 
54
54
 
55
+ **参考**: [ループの中で異なる値で定義されたラムダ式が、同じ値を返すのはなぜですか?](https://docs.python.org/ja/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result)
56
+
57
+
58
+
55
59
  2. リストをデフォルト引数にしない
56
60
 
57
61
  ---
@@ -112,6 +116,10 @@
112
116
 
113
117
 
114
118
 
119
+ **参考**: [なぜオブジェクト間でデフォルト値が共有されるのですか?](https://docs.python.org/ja/3/faq/programming.html#why-are-default-values-shared-between-objects)
120
+
121
+
122
+
115
123
  トレース
116
124
 
117
125
  ---

5

修正

2021/02/13 13:57

投稿

LouiS0616
LouiS0616

スコア35668

test CHANGED
@@ -126,7 +126,9 @@
126
126
 
127
127
  for i in range(3):
128
128
 
129
+ list.append(lambda x:x+i-1)
130
+
129
- list.append(lambda x:x+i-1) # この時点で全要素が lambda x: x+2-1 になっている
131
+ # ループ終了時点で全要素が lambda x: x+2-1 になっている
130
132
 
131
133
 
132
134
 
@@ -154,7 +156,9 @@
154
156
 
155
157
  for i in range(3):
156
158
 
157
- list.append(lambda x:x+i-1) # 全要素が lambda x: x+2-1
159
+ list.append(lambda x:x+i-1)
160
+
161
+                   # 全要素が lambda x: x+2-1
158
162
 
159
163
 
160
164
 
@@ -188,7 +192,9 @@
188
192
 
189
193
  for i in range(3):
190
194
 
191
- list.append(lambda x:x+i-1) # 全要素が lambda x: x+2-1
195
+ list.append(lambda x:x+i-1)
196
+
197
+    # 全要素が lambda x: x+2-1
192
198
 
193
199
 
194
200
 

4

追記

2021/02/13 13:49

投稿

LouiS0616
LouiS0616

スコア35668

test CHANGED
@@ -134,7 +134,7 @@
134
134
 
135
135
 
136
136
 
137
- for a in list:
137
+ for a in list: # リスト長は3
138
138
 
139
139
  sum += a(1) # a(1) は常に 1+2-1 = 2 を返す
140
140
 
@@ -196,7 +196,7 @@
196
196
 
197
197
 
198
198
 
199
- for a in list:
199
+ for a in list: # リスト長は6
200
200
 
201
201
  sum += a(price) # a(1) は常に 1+2-1 = 2 を返す
202
202
 
@@ -209,3 +209,43 @@
209
209
  print(abc(1))
210
210
 
211
211
  ```
212
+
213
+
214
+
215
+ 解決案
216
+
217
+ ---
218
+
219
+ 少なくとも今回のコードについては、あまり難しく考える必要は無いでしょう。
220
+
221
+ ```Python
222
+
223
+ def abc(price):
224
+
225
+ ret = 0
226
+
227
+ for i in range(3):
228
+
229
+ ret += price + i - 1
230
+
231
+
232
+
233
+ return ret
234
+
235
+ ```
236
+
237
+
238
+
239
+ あるいは
240
+
241
+ ```Python
242
+
243
+ def abc(price):
244
+
245
+ return sum(
246
+
247
+ price + i - 1 for i in range(3)
248
+
249
+ )
250
+
251
+ ```

3

追記

2021/02/13 13:46

投稿

LouiS0616
LouiS0616

スコア35668

test CHANGED
@@ -40,6 +40,18 @@
40
40
 
41
41
 
42
42
 
43
+ 次のように回避する方法が知られています。
44
+
45
+ ```Python
46
+
47
+ for i in range(3):
48
+
49
+ funcs.append(lambda e=i: print(f'e = {e}')) # 外部変数iを直接使わない
50
+
51
+ ```
52
+
53
+
54
+
43
55
  2. リストをデフォルト引数にしない
44
56
 
45
57
  ---
@@ -80,6 +92,26 @@
80
92
 
81
93
 
82
94
 
95
+ 次のように回避する方法が知られています。
96
+
97
+ ```Python
98
+
99
+ def func(e, lst=None): # デフォルト引数をNoneにする
100
+
101
+ if lst is None:
102
+
103
+ lst = []
104
+
105
+
106
+
107
+ lst.append(e)
108
+
109
+ print(lst)
110
+
111
+ ```
112
+
113
+
114
+
83
115
  トレース
84
116
 
85
117
  ---

2

追記

2021/02/13 13:43

投稿

LouiS0616
LouiS0616

スコア35668

test CHANGED
@@ -77,3 +77,103 @@
77
77
  [0, 1, 2]
78
78
 
79
79
  ```
80
+
81
+
82
+
83
+ トレース
84
+
85
+ ---
86
+
87
+ **一つ目のコード**
88
+
89
+
90
+
91
+ ```Python
92
+
93
+ list=[]
94
+
95
+ for i in range(3):
96
+
97
+ list.append(lambda x:x+i-1) # この時点で全要素が lambda x: x+2-1 になっている
98
+
99
+
100
+
101
+ sum=0
102
+
103
+
104
+
105
+ for a in list:
106
+
107
+ sum += a(1) # a(1) は常に 1+2-1 = 2 を返す
108
+
109
+ print(sum) # 3回足したら 3x2 = 6
110
+
111
+ ```
112
+
113
+
114
+
115
+ **二つ目のコード・前半**
116
+
117
+ ```Python
118
+
119
+ def abc(price,list=[]):
120
+
121
+
122
+
123
+ for i in range(3):
124
+
125
+ list.append(lambda x:x+i-1) # 全要素が lambda x: x+2-1
126
+
127
+
128
+
129
+ sum=0
130
+
131
+
132
+
133
+ for a in list:
134
+
135
+ sum += a(price) # a(0) は常に 0+2-1 = 1 を返す
136
+
137
+
138
+
139
+ return sum # 3回足したら 3
140
+
141
+
142
+
143
+ print(abc(0))
144
+
145
+ ```
146
+
147
+
148
+
149
+ **二つ目のコード・後半**
150
+
151
+ ```Python
152
+
153
+ def abc(price,list=[]): # 関数突入時点で list = [lambda x: x+2-1 が3つ]
154
+
155
+
156
+
157
+ for i in range(3):
158
+
159
+ list.append(lambda x:x+i-1) # 全要素が lambda x: x+2-1
160
+
161
+
162
+
163
+ sum=0
164
+
165
+
166
+
167
+ for a in list:
168
+
169
+ sum += a(price) # a(1) は常に 1+2-1 = 2 を返す
170
+
171
+
172
+
173
+ return sum # 6回足したら 12
174
+
175
+
176
+
177
+ print(abc(1))
178
+
179
+ ```

1

修正

2021/02/13 13:37

投稿

LouiS0616
LouiS0616

スコア35668

test CHANGED
@@ -1,4 +1,4 @@
1
- 複合的な、しかもそれぞれが分かりづらい原因です。
1
+ 複合的な、しかもそれぞれが分かりづらい理由挙動を追いづらくなっています。
2
2
 
3
3
 
4
4