回答編集履歴
9
説明途中にコードを移動
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
括弧を全角で統一
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
関数を呼び出すときに`result`引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 `result` に デフォルト値(この場合は`None`) が代入されます。
|
4
4
|
|
5
|
-
その後、`result = []` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値
|
5
|
+
その後、`result = []` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値(この場合は`None`)は変更されません。
|
6
6
|
|
7
7
|
|
8
8
|
|
7
文言修正
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
関数を呼び出すときに`result`引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 `result` に デフォルト値(この場合は`None`) が代入されます。
|
4
4
|
|
5
|
-
その後、`result =
|
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
ハイライト
test
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
デフォルト値
|
1
|
+
デフォルト値(この場合は`None`)は、関数オブジェクトの`__defaults__`に保持されます。
|
2
2
|
|
3
|
-
関数を呼び出すときにresult引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 result に デフォルト値
|
3
|
+
関数を呼び出すときに`result`引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 `result` に デフォルト値(この場合は`None`) が代入されます。
|
4
4
|
|
5
|
-
その後、`result = 1` などで別の値を代入しても、ローカル変数 result が変更されるだけで、関数オブジェクトにあるデフォルト値Noneは変更されません。
|
5
|
+
その後、`result = 1` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値(この場合は`None`)は変更されません。
|
6
6
|
|
7
7
|
|
8
8
|
|
5
説明変更
test
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
-
関数
|
1
|
+
デフォルト値(この場合はNone)は、関数オブジェクトの`__defaults__`に保持されます。
|
2
2
|
|
3
|
-
result
|
3
|
+
関数を呼び出すときにresult引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 result に デフォルト値(この場合はNone) が代入されます。
|
4
4
|
|
5
|
-
|
5
|
+
その後、`result = 1` などで別の値を代入しても、ローカル変数 result が変更されるだけで、関数オブジェクトにあるデフォルト値Noneは変更されません。
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
ただし、デフォルト値がリストなどのミュータブルオブジェクト(変更可能なオブジェクト)で、デフォルト値に対して`.append`などを実行した場合、デフォルト値のオブジェクトが変更され、次の関数呼出し時には変更されたデフォルト値が使用されることになります。
|
6
10
|
|
7
11
|
|
8
12
|
|
4
追記
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
補足
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
説明追記
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
デフォルト値強制変更例追記
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
|
+
```
|