回答編集履歴
3
接続語
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
追記
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
追記
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
|
```
|