回答編集履歴
9
説明途中にコードを移動
answer
CHANGED
@@ -1,9 +1,5 @@
|
|
1
|
-
デフォルト値(この場合は`None`)は、関数オブジェクトの`__defaults__`に保持されます。
|
1
|
+
デフォルト値(この場合は`None`)は、関数オブジェクト(この場合は`nonbuggy`)の`.__defaults__`に保持されます。
|
2
|
-
関数を呼び出すときに`result`引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 `result` に デフォルト値(この場合は`None`) が代入されます。
|
3
|
-
その後、`result = []` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値(この場合は`None`)は変更されません。
|
4
2
|
|
5
|
-
ただし、デフォルト値がリストなどのミュータブルオブジェクト(変更可能なオブジェクト)で、デフォルト値に対して`.append`などを実行した場合、デフォルト値のオブジェクトが変更され、次の関数呼出し時には変更されたデフォルト値が使用されることになります。
|
6
|
-
|
7
3
|
```python
|
8
4
|
>>> def nonbuggy(arg, result=None):
|
9
5
|
... if result is None:
|
@@ -13,14 +9,22 @@
|
|
13
9
|
...
|
14
10
|
>>> nonbuggy.__defaults__
|
15
11
|
(None,)
|
12
|
+
```
|
13
|
+
|
14
|
+
関数を呼び出すときに`result`引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 `result` に デフォルト値(この場合は`None`) が代入されます。
|
15
|
+
その後、`result = []` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値(この場合は`None`)は変更されません。
|
16
|
+
|
17
|
+
```python
|
16
18
|
>>> nonbuggy(1)
|
17
19
|
[1]
|
18
20
|
>>> nonbuggy.__defaults__
|
19
21
|
(None,)
|
20
22
|
```
|
21
23
|
|
22
|
-
デフォルト値
|
24
|
+
ただし、デフォルト値がリストなどのミュータブルオブジェクト(変更可能なオブジェクト)で、デフォルト値に対して`.append`などを実行した場合、デフォルト値のオブジェクトが変更され、次の関数呼出し時には変更されたデフォルト値が使用されることになります。
|
23
25
|
|
26
|
+
デフォルト値を無理矢理ミュータブルオブジェクトに変えて、その挙動を確認できます。
|
27
|
+
|
24
28
|
```python
|
25
29
|
>>> nonbuggy.__defaults__ = (['hoge'],)
|
26
30
|
>>> nonbuggy(1)
|
8
括弧を全角で統一
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
デフォルト値(この場合は`None`)は、関数オブジェクトの`__defaults__`に保持されます。
|
2
2
|
関数を呼び出すときに`result`引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 `result` に デフォルト値(この場合は`None`) が代入されます。
|
3
|
-
その後、`result = []` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値
|
3
|
+
その後、`result = []` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値(この場合は`None`)は変更されません。
|
4
4
|
|
5
5
|
ただし、デフォルト値がリストなどのミュータブルオブジェクト(変更可能なオブジェクト)で、デフォルト値に対して`.append`などを実行した場合、デフォルト値のオブジェクトが変更され、次の関数呼出し時には変更されたデフォルト値が使用されることになります。
|
6
6
|
|
7
文言修正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
デフォルト値(この場合は`None`)は、関数オブジェクトの`__defaults__`に保持されます。
|
2
2
|
関数を呼び出すときに`result`引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 `result` に デフォルト値(この場合は`None`) が代入されます。
|
3
|
-
その後、`result =
|
3
|
+
その後、`result = []` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値(この場合は`None`)は変更されません。
|
4
4
|
|
5
5
|
ただし、デフォルト値がリストなどのミュータブルオブジェクト(変更可能なオブジェクト)で、デフォルト値に対して`.append`などを実行した場合、デフォルト値のオブジェクトが変更され、次の関数呼出し時には変更されたデフォルト値が使用されることになります。
|
6
6
|
|
@@ -19,7 +19,7 @@
|
|
19
19
|
(None,)
|
20
20
|
```
|
21
21
|
|
22
|
-
デフォルト値を無理矢理変えると挙動が変わります。
|
22
|
+
デフォルト値を無理矢理ミュータブルオブジェクトに変えると挙動が変わります。
|
23
23
|
|
24
24
|
```python
|
25
25
|
>>> nonbuggy.__defaults__ = (['hoge'],)
|
6
ハイライト
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
デフォルト値
|
1
|
+
デフォルト値(この場合は`None`)は、関数オブジェクトの`__defaults__`に保持されます。
|
2
|
-
関数を呼び出すときにresult引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 result に デフォルト値
|
2
|
+
関数を呼び出すときに`result`引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 `result` に デフォルト値(この場合は`None`) が代入されます。
|
3
|
-
その後、`result = 1` などで別の値を代入しても、ローカル変数 result が変更されるだけで、関数オブジェクトにあるデフォルト値Noneは変更されません。
|
3
|
+
その後、`result = 1` などで別の値を代入しても、ローカル変数 `result` が変更されるだけで、関数オブジェクトにあるデフォルト値(この場合は`None`)は変更されません。
|
4
4
|
|
5
5
|
ただし、デフォルト値がリストなどのミュータブルオブジェクト(変更可能なオブジェクト)で、デフォルト値に対して`.append`などを実行した場合、デフォルト値のオブジェクトが変更され、次の関数呼出し時には変更されたデフォルト値が使用されることになります。
|
6
6
|
|
5
説明変更
answer
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
-
関数を呼び出す毎に result=None を実行しているからです。
|
2
|
-
resultはローカル変数で、デフォルト値Noneを変更しているわけではありません。
|
3
|
-
|
1
|
+
デフォルト値(この場合はNone)は、関数オブジェクトの`__defaults__`に保持されます。
|
2
|
+
関数を呼び出すときにresult引数を指定しなかった場合、`result = 関数オブジェクトにあるデフォルト値` が実行されるため、その都度、ローカル変数 result に デフォルト値(この場合はNone) が代入されます。
|
3
|
+
その後、`result = 1` などで別の値を代入しても、ローカル変数 result が変更されるだけで、関数オブジェクトにあるデフォルト値Noneは変更されません。
|
4
4
|
|
5
|
+
ただし、デフォルト値がリストなどのミュータブルオブジェクト(変更可能なオブジェクト)で、デフォルト値に対して`.append`などを実行した場合、デフォルト値のオブジェクトが変更され、次の関数呼出し時には変更されたデフォルト値が使用されることになります。
|
6
|
+
|
5
7
|
```python
|
6
8
|
>>> def nonbuggy(arg, result=None):
|
7
9
|
... if result is None:
|
4
追記
answer
CHANGED
@@ -11,6 +11,10 @@
|
|
11
11
|
...
|
12
12
|
>>> nonbuggy.__defaults__
|
13
13
|
(None,)
|
14
|
+
>>> nonbuggy(1)
|
15
|
+
[1]
|
16
|
+
>>> nonbuggy.__defaults__
|
17
|
+
(None,)
|
14
18
|
```
|
15
19
|
|
16
20
|
デフォルト値を無理矢理変えると挙動が変わります。
|
3
補足
answer
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
関数を呼び出す毎に result=None を実行しているからです。
|
2
|
-
resultはローカル変数で、デフォルト値を変更しているわけではありません。
|
2
|
+
resultはローカル変数で、デフォルト値Noneを変更しているわけではありません。
|
3
3
|
ちなみに、None は関数オブジェクトが持っています。
|
4
4
|
|
5
5
|
```python
|
2
説明追記
answer
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
関数を呼び出す毎に result=None を実行しているからです。
|
2
|
+
resultはローカル変数で、デフォルト値を変更しているわけではありません。
|
2
3
|
ちなみに、None は関数オブジェクトが持っています。
|
3
4
|
|
4
|
-
|
5
5
|
```python
|
6
6
|
>>> def nonbuggy(arg, result=None):
|
7
7
|
... if result is None:
|
1
デフォルト値強制変更例追記
answer
CHANGED
@@ -11,4 +11,16 @@
|
|
11
11
|
...
|
12
12
|
>>> nonbuggy.__defaults__
|
13
13
|
(None,)
|
14
|
+
```
|
15
|
+
|
16
|
+
デフォルト値を無理矢理変えると挙動が変わります。
|
17
|
+
|
18
|
+
```python
|
19
|
+
>>> nonbuggy.__defaults__ = (['hoge'],)
|
20
|
+
>>> nonbuggy(1)
|
21
|
+
['hoge', 1]
|
22
|
+
>>> nonbuggy(3)
|
23
|
+
['hoge', 1, 3]
|
24
|
+
>>> nonbuggy.__defaults__
|
25
|
+
(['hoge', 1, 3],)
|
14
26
|
```
|