回答編集履歴

3

接続語

2019/01/19 07:58

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -1,4 +1,4 @@
1
- Pythonの場合、仮引数のデフォルト値は関数オブジェクト自体が保持しています。
1
+ Pythonの場合、確かに仮引数のデフォルト値は関数オブジェクト自体が保持しています。
2
2
 
3
3
  ```Python
4
4
 

2

追記

2019/01/19 07:58

投稿

LouiS0616
LouiS0616

スコア35660

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

1

追記

2019/01/19 07:55

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -38,4 +38,16 @@
38
38
 
39
39
  (1989418613576, [0, 0, 0, 0]) # 関数に結び付いているデフォルト値は変わらない
40
40
 
41
+ >>>
42
+
43
+ >>> func(flag=True) # ローカル変数は毎回別物
44
+
45
+ (1989418613512, [0])
46
+
47
+ >>>
48
+
49
+ >>> func(flag=True) # idが被ることもあるが、使い捨てのオブジェクトなら問題ない
50
+
51
+ (1989418613000, [0])
52
+
41
53
  ```