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

回答編集履歴

3

接続語

2019/01/19 07:58

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,4 +1,4 @@
1
- Pythonの場合、仮引数のデフォルト値は関数オブジェクト自体が保持しています。
1
+ Pythonの場合、確かに仮引数のデフォルト値は関数オブジェクト自体が保持しています。
2
2
  ```Python
3
3
  >>> def func(a, b=[], c='spam'):
4
4
  ... print(a, b, c)

2

追記

2019/01/19 07:58

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,5 +1,26 @@
1
- 変数へ再代入が行われたならそれは同名であるだけで別のオブジェクトす。
1
+ Python場合仮引数デフォルト値は関数オブジェクト自体が保持しています。
2
2
  ```Python
3
+ >>> def func(a, b=[], c='spam'):
4
+ ... print(a, b, c)
5
+ ...
6
+ >>> func(0)
7
+ 0 [] spam
8
+ >>>
9
+ >>> func()
10
+ Traceback (most recent call last):
11
+ File "<stdin>", line 1, in <module>
12
+ TypeError: func() missing 1 required positional argument: 'a'
13
+ >>>
14
+ >>> func.__defaults__
15
+ ([], 'spam')
16
+ >>>
17
+ >>> func.__defaults__ = 42, {}, 'ham' # しかも変更可能な謎仕様
18
+ >>> func()
19
+ 42 {} ham
20
+ ```
21
+
22
+ ただし、変数への再代入が行われたなら、それは同名であるだけで別のオブジェクトです。
23
+ ```Python
3
24
  >>> def func(arg=[], flag=False):
4
25
  ... if flag:
5
26
  ... arg = []

1

追記

2019/01/19 07:55

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -18,4 +18,10 @@
18
18
  >>>
19
19
  >>> func()
20
20
  (1989418613576, [0, 0, 0, 0]) # 関数に結び付いているデフォルト値は変わらない
21
+ >>>
22
+ >>> func(flag=True) # ローカル変数は毎回別物
23
+ (1989418613512, [0])
24
+ >>>
25
+ >>> func(flag=True) # idが被ることもあるが、使い捨てのオブジェクトなら問題ない
26
+ (1989418613000, [0])
21
27
  ```