回答編集履歴

4

追記

2020/02/13 00:14

投稿

quickquip
quickquip

スコア11235

test CHANGED
@@ -27,3 +27,117 @@
27
27
  「実引数が仮引数にコピーされる」は誤った認識からでてきた文です。
28
28
 
29
29
  「値が、実引数から仮引数にコピーされる」の方がPythonの実行モデルには合っています。("コピーされる"が曖昧なままですが方便ですので)
30
+
31
+
32
+
33
+ > ➁入門python3ではそもそも「実引数が仮引数にコピーされる」というような表現がされていましたが、いまいちピンと来ていないので理解があいまいなままです。「実引数が仮引数にコピーされる」とはどういうことでしょうか?
34
+
35
+
36
+
37
+ Pythonの説明としては、これは"嘘"でしょう。
38
+
39
+ まだよくわかってない人になんとなくイメージだけさせるための方便であって、実際にはそのようには動いていません。
40
+
41
+
42
+
43
+ p111
44
+
45
+
46
+
47
+ > (実)引数を渡して関数を呼び出すとき、それらの値は関数内の対応する(仮)引数にコピーされる
48
+
49
+
50
+
51
+ とあります。
52
+
53
+ "コピーされる"の主語を正しく読み取ってください。
54
+
55
+ コピーされるのは「変数」ではないです。「値」です。
56
+
57
+
58
+
59
+ ~~「実引数が仮引数にコピーされる」は誤った認識からでてきた文です。~~
60
+
61
+ ~~「値が、実引数から仮引数にコピーされる」の方がPythonの実行モデルには合っています。("コピーされる"が曖昧なままですが方便ですので)~~
62
+
63
+
64
+
65
+ ----
66
+
67
+
68
+
69
+ やっぱり「方便としての嘘」なのが気になったので、上の最後の方を取り消し線にしました。
70
+
71
+
72
+
73
+ ```pyhton
74
+
75
+ a = [] //★1
76
+
77
+
78
+
79
+ b = a //★2
80
+
81
+ ```
82
+
83
+ とした時「値がaからbにコピーされている」というようなことは決して起こっていません。
84
+
85
+ この時、★1の右辺で作られたリストのオプジェクトがあって、★2によってaもbもその同じオブジェクトを指している/参照している/束縛している、という状態になります。
86
+
87
+ より精確には「右辺のaを評価してでてきた値」をbに束縛する、という動作がなされます。
88
+
89
+
90
+
91
+
92
+
93
+ だから、
94
+
95
+ ```python
96
+
97
+ b.append(1) //★3
98
+
99
+
100
+
101
+ print(a) //★4
102
+
103
+ ```
104
+
105
+ とすると★3で「aとbが指しているリストのオブジェクト」に追加されるので、★4は`[1]`という結果になります。
106
+
107
+
108
+
109
+ ```python
110
+
111
+ b = [] //★5
112
+
113
+
114
+
115
+ b.append(2) //★6
116
+
117
+
118
+
119
+ print(a) //★7
120
+
121
+ ```
122
+
123
+ とすると★5で新しく別のリストオブジェクトが作られて、aは★1で作られたオブジェクト、bは★5で作られたオブジェクトを指している、という状況になります。だから★6でリストに2を追加してもaが指しているオブジェクトには影響がなく、★7の結果は`[1]`のままです。
124
+
125
+
126
+
127
+ さて。
128
+
129
+ 関数呼び出しをした時の、実引数から仮引数への受け渡しの挙動は★2で起こることにそっくりです。
130
+
131
+
132
+
133
+ 呼び出された側の関数のローカルな名前空間上の名前 = 呼び出した側の引数を評価した値
134
+
135
+
136
+
137
+ ということが起こっています。
138
+
139
+
140
+
141
+ `k('NI!')`という式を評価すると、「式`'NI!'`を評価したオブジェクト」が「kの実行時にできるローカルな名前空間」にsayingという名前で束縛されて、そののちkの本体が実行されます
142
+
143
+ `i(saying)`という式を評価すると、「式`'saying`を評価したオブジェクト」が「iの実行時にできるローカルな名前空間」にquoteという名前で束縛されて、そののちiの本体が実行されます

3

後半削除しました。

2020/02/13 00:14

投稿

quickquip
quickquip

スコア11235

test CHANGED
@@ -1,7 +1,3 @@
1
- これは回答ではありません。
2
-
3
-
4
-
5
1
  > ➁入門python3ではそもそも「実引数が仮引数にコピーされる」というような表現がされていましたが、いまいちピンと来ていないので理解があいまいなままです。「実引数が仮引数にコピーされる」とはどういうことでしょうか?
6
2
 
7
3
 
@@ -31,53 +27,3 @@
31
27
  「実引数が仮引数にコピーされる」は誤った認識からでてきた文です。
32
28
 
33
29
  「値が、実引数から仮引数にコピーされる」の方がPythonの実行モデルには合っています。("コピーされる"が曖昧なままですが方便ですので)
34
-
35
-
36
-
37
- ----
38
-
39
-
40
-
41
- 入門python3はオライリーの本ですよね?
42
-
43
- p122に「実引数が仮引数にコピーされる」などと書いてある箇所はありません。
44
-
45
-
46
-
47
- > return inner2 という行は、このinner2関数のために専用のコピーを返す
48
-
49
-
50
-
51
- という箇所はありますね。
52
-
53
-
54
-
55
- しかしながら、それが書いてある箇所は、質問で引用されたソースの**次の**章です。
56
-
57
- 関数内関数の次の、クロージャについてのソースコード
58
-
59
-
60
-
61
- ```python
62
-
63
- def knigtes2(saying):
64
-
65
- def inner2(quote):
66
-
67
- return "We are the knights who say: '%s'" % saying
68
-
69
- return inner2
70
-
71
- ```
72
-
73
- に付された解説です。
74
-
75
-
76
-
77
- ここで"コピーされる"と説明されている対象は**inner2関数そのものです**。
78
-
79
- 引数についての説明された文ではありません。
80
-
81
-
82
-
83
- 文章に書かれていない文意を誤って読んでしまっていると思います。

2

些細

2020/02/12 00:09

投稿

quickquip
quickquip

スコア11235

test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  とあります。
24
24
 
25
- コピーされるの主語を正しく取ってください。
25
+ "コピーされる"の主語を正しく読み取ってください。
26
26
 
27
27
  コピーされるのは「変数」ではないです。「値」です。
28
28
 

1

追記

2020/02/12 00:07

投稿

quickquip
quickquip

スコア11235

test CHANGED
@@ -9,6 +9,28 @@
9
9
  Pythonの説明としては、これは"嘘"でしょう。
10
10
 
11
11
  まだよくわかってない人になんとなくイメージだけさせるための方便であって、実際にはそのようには動いていません。
12
+
13
+
14
+
15
+ p111
16
+
17
+
18
+
19
+ > (実)引数を渡して関数を呼び出すとき、それらの値は関数内の対応する(仮)引数にコピーされる
20
+
21
+
22
+
23
+ とあります。
24
+
25
+ コピーされるのの主語を正しく取ってください。
26
+
27
+ コピーされるのは「変数」ではないです。「値」です。
28
+
29
+
30
+
31
+ 「実引数が仮引数にコピーされる」は誤った認識からでてきた文です。
32
+
33
+ 「値が、実引数から仮引数にコピーされる」の方がPythonの実行モデルには合っています。("コピーされる"が曖昧なままですが方便ですので)
12
34
 
13
35
 
14
36