質問するログイン新規登録

回答編集履歴

9

説明途中にコードを移動

2020/02/11 00:21

投稿

shiracamus
shiracamus

スコア5406

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

括弧を全角で統一

2020/02/11 00:21

投稿

shiracamus
shiracamus

スコア5406

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

7

文言修正

2020/02/10 23:31

投稿

shiracamus
shiracamus

スコア5406

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

ハイライト

2020/02/10 22:30

投稿

shiracamus
shiracamus

スコア5406

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

5

説明変更

2020/02/10 22:13

投稿

shiracamus
shiracamus

スコア5406

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

追記

2020/02/10 22:10

投稿

shiracamus
shiracamus

スコア5406

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

補足

2020/02/10 15:21

投稿

shiracamus
shiracamus

スコア5406

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

2

説明追記

2020/02/10 15:19

投稿

shiracamus
shiracamus

スコア5406

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

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

2020/02/10 14:57

投稿

shiracamus
shiracamus

スコア5406

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
  ```