回答編集履歴

9

説明途中にコードを移動

2020/02/11 00:21

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -1,12 +1,4 @@
1
- デフォルト値(この場合は`None`)は、関数オブジェクトの`__defaults__`に保持されます。
1
+ デフォルト値(この場合は`None`)は、関数オブジェクト(こ場合は`nonbuggy`)の`.__defaults__`に保持されます。
2
-
3
- 関数を呼び出すときに`result`引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 `result` に デフォルト値(この場合は`None`) が代入されます。
4
-
5
- その後、`result = []` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値(この場合は`None`)は変更されません。
6
-
7
-
8
-
9
- ただし、デフォルト値がリストなどのミュータブルオブジェクト(変更可能なオブジェクト)で、デフォルト値に対して`.append`などを実行した場合、デフォルト値のオブジェクトが変更され、次の関数呼出し時には変更されたデフォルト値が使用されることになります。
10
2
 
11
3
 
12
4
 
@@ -28,6 +20,18 @@
28
20
 
29
21
  (None,)
30
22
 
23
+ ```
24
+
25
+
26
+
27
+ 関数を呼び出すときに`result`引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 `result` に デフォルト値(この場合は`None`) が代入されます。
28
+
29
+ その後、`result = []` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値(この場合は`None`)は変更されません。
30
+
31
+
32
+
33
+ ```python
34
+
31
35
  >>> nonbuggy(1)
32
36
 
33
37
  [1]
@@ -40,7 +44,11 @@
40
44
 
41
45
 
42
46
 
47
+ ただし、デフォルト値がリストなどのミュータブルオブジェクト(変更可能なオブジェクト)で、デフォルト値に対して`.append`などを実行した場合、デフォルト値のオブジェクトが変更され、次の関数呼出し時には変更されたデフォルト値が使用されることになります。
48
+
49
+
50
+
43
- デフォルト値を無理矢理ミュータブルオブジェクトに変えると挙動が変わります。
51
+ デフォルト値を無理矢理ミュータブルオブジェクトに変えて、その挙動を確認できます。
44
52
 
45
53
 
46
54
 

8

括弧を全角で統一

2020/02/11 00:21

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  関数を呼び出すときに`result`引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 `result` に デフォルト値(この場合は`None`) が代入されます。
4
4
 
5
- その後、`result = []` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値(この場合は`None`)は変更されません。
5
+ その後、`result = []` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値この場合は`None`は変更されません。
6
6
 
7
7
 
8
8
 

7

文言修正

2020/02/10 23:31

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  関数を呼び出すときに`result`引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 `result` に デフォルト値(この場合は`None`) が代入されます。
4
4
 
5
- その後、`result = 1` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値(この場合は`None`)は変更されません。
5
+ その後、`result = []` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値(この場合は`None`)は変更されません。
6
6
 
7
7
 
8
8
 
@@ -40,7 +40,7 @@
40
40
 
41
41
 
42
42
 
43
- デフォルト値を無理矢理変えると挙動が変わります。
43
+ デフォルト値を無理矢理ミュータブルオブジェクトに変えると挙動が変わります。
44
44
 
45
45
 
46
46
 

6

ハイライト

2020/02/10 22:30

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -1,8 +1,8 @@
1
- デフォルト値(この場合はNone)は、関数オブジェクトの`__defaults__`に保持されます。
1
+ デフォルト値この場合は`None`)は、関数オブジェクトの`__defaults__`に保持されます。
2
2
 
3
- 関数を呼び出すときにresult引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 result に デフォルト値(この場合はNone) が代入されます。
3
+ 関数を呼び出すときに`result`引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 `result` に デフォルト値この場合は`None`) が代入されます。
4
4
 
5
- その後、`result = 1` などで別の値を代入しても、ローカル変数 result が変更されるだけで、関数オブジェクトにあるデフォルト値Noneは変更されません。
5
+ その後、`result = 1` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値(この場合は`None`)は変更されません。
6
6
 
7
7
 
8
8
 

5

説明変更

2020/02/10 22:13

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -1,8 +1,12 @@
1
- 関数を呼び出す毎に result=None を実行しているからです。
1
+ デフォルト値(この場合はNone)は、関数オブジェクトの`__defaults__`に保持されます。
2
2
 
3
- resultローカル変数で、デフォルト値Noneを変更しているわけではありせん
3
+ 関数を呼び出すときにresult引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 result に デフォルト値(この場合はNone) が代入され
4
4
 
5
- みにNone 関数オブジェクトが持ってい
5
+ その後、`result = 1` どで別の値を代入してもローカル変数 result が変更されるだけで、関数オブジェクトにあるデフォルト値Noneは変更されせん
6
+
7
+
8
+
9
+ ただし、デフォルト値がリストなどのミュータブルオブジェクト(変更可能なオブジェクト)で、デフォルト値に対して`.append`などを実行した場合、デフォルト値のオブジェクトが変更され、次の関数呼出し時には変更されたデフォルト値が使用されることになります。
6
10
 
7
11
 
8
12
 

4

追記

2020/02/10 22:10

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -19,6 +19,14 @@
19
19
  ... print(result)
20
20
 
21
21
  ...
22
+
23
+ >>> nonbuggy.__defaults__
24
+
25
+ (None,)
26
+
27
+ >>> nonbuggy(1)
28
+
29
+ [1]
22
30
 
23
31
  >>> nonbuggy.__defaults__
24
32
 

3

補足

2020/02/10 15:21

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -1,6 +1,6 @@
1
1
  関数を呼び出す毎に result=None を実行しているからです。
2
2
 
3
- resultはローカル変数で、デフォルト値を変更しているわけではありません。
3
+ resultはローカル変数で、デフォルト値Noneを変更しているわけではありません。
4
4
 
5
5
  ちなみに、None は関数オブジェクトが持っています。
6
6
 

2

説明追記

2020/02/10 15:19

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -1,8 +1,8 @@
1
1
  関数を呼び出す毎に result=None を実行しているからです。
2
2
 
3
+ resultはローカル変数で、デフォルト値を変更しているわけではありません。
4
+
3
5
  ちなみに、None は関数オブジェクトが持っています。
4
-
5
-
6
6
 
7
7
 
8
8
 

1

デフォルト値強制変更例追記

2020/02/10 14:57

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -25,3 +25,27 @@
25
25
  (None,)
26
26
 
27
27
  ```
28
+
29
+
30
+
31
+ デフォルト値を無理矢理変えると挙動が変わります。
32
+
33
+
34
+
35
+ ```python
36
+
37
+ >>> nonbuggy.__defaults__ = (['hoge'],)
38
+
39
+ >>> nonbuggy(1)
40
+
41
+ ['hoge', 1]
42
+
43
+ >>> nonbuggy(3)
44
+
45
+ ['hoge', 1, 3]
46
+
47
+ >>> nonbuggy.__defaults__
48
+
49
+ (['hoge', 1, 3],)
50
+
51
+ ```