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

回答編集履歴

4

追記

2020/02/13 00:14

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -12,4 +12,61 @@
12
12
  コピーされるのは「変数」ではないです。「値」です。
13
13
 
14
14
  「実引数が仮引数にコピーされる」は誤った認識からでてきた文です。
15
- 「値が、実引数から仮引数にコピーされる」の方がPythonの実行モデルには合っています。("コピーされる"が曖昧なままですが方便ですので)
15
+ 「値が、実引数から仮引数にコピーされる」の方がPythonの実行モデルには合っています。("コピーされる"が曖昧なままですが方便ですので)
16
+
17
+ > ➁入門python3ではそもそも「実引数が仮引数にコピーされる」というような表現がされていましたが、いまいちピンと来ていないので理解があいまいなままです。「実引数が仮引数にコピーされる」とはどういうことでしょうか?
18
+
19
+ Pythonの説明としては、これは"嘘"でしょう。
20
+ まだよくわかってない人になんとなくイメージだけさせるための方便であって、実際にはそのようには動いていません。
21
+
22
+ p111
23
+
24
+ > (実)引数を渡して関数を呼び出すとき、それらの値は関数内の対応する(仮)引数にコピーされる
25
+
26
+ とあります。
27
+ "コピーされる"の主語を正しく読み取ってください。
28
+ コピーされるのは「変数」ではないです。「値」です。
29
+
30
+ ~~「実引数が仮引数にコピーされる」は誤った認識からでてきた文です。~~
31
+ ~~「値が、実引数から仮引数にコピーされる」の方がPythonの実行モデルには合っています。("コピーされる"が曖昧なままですが方便ですので)~~
32
+
33
+ ----
34
+
35
+ やっぱり「方便としての嘘」なのが気になったので、上の最後の方を取り消し線にしました。
36
+
37
+ ```pyhton
38
+ a = [] //★1
39
+
40
+ b = a //★2
41
+ ```
42
+ とした時「値がaからbにコピーされている」というようなことは決して起こっていません。
43
+ この時、★1の右辺で作られたリストのオプジェクトがあって、★2によってaもbもその同じオブジェクトを指している/参照している/束縛している、という状態になります。
44
+ より精確には「右辺のaを評価してでてきた値」をbに束縛する、という動作がなされます。
45
+
46
+
47
+ だから、
48
+ ```python
49
+ b.append(1) //★3
50
+
51
+ print(a) //★4
52
+ ```
53
+ とすると★3で「aとbが指しているリストのオブジェクト」に追加されるので、★4は`[1]`という結果になります。
54
+
55
+ ```python
56
+ b = [] //★5
57
+
58
+ b.append(2) //★6
59
+
60
+ print(a) //★7
61
+ ```
62
+ とすると★5で新しく別のリストオブジェクトが作られて、aは★1で作られたオブジェクト、bは★5で作られたオブジェクトを指している、という状況になります。だから★6でリストに2を追加してもaが指しているオブジェクトには影響がなく、★7の結果は`[1]`のままです。
63
+
64
+ さて。
65
+ 関数呼び出しをした時の、実引数から仮引数への受け渡しの挙動は★2で起こることにそっくりです。
66
+
67
+ 呼び出された側の関数のローカルな名前空間上の名前 = 呼び出した側の引数を評価した値
68
+
69
+ ということが起こっています。
70
+
71
+ `k('NI!')`という式を評価すると、「式`'NI!'`を評価したオブジェクト」が「kの実行時にできるローカルな名前空間」にsayingという名前で束縛されて、そののちkの本体が実行されます
72
+ `i(saying)`という式を評価すると、「式`'saying`を評価したオブジェクト」が「iの実行時にできるローカルな名前空間」にquoteという名前で束縛されて、そののちiの本体が実行されます

3

後半削除しました。

2020/02/13 00:14

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -1,5 +1,3 @@
1
- これは回答ではありません。
2
-
3
1
  > ➁入門python3ではそもそも「実引数が仮引数にコピーされる」というような表現がされていましたが、いまいちピンと来ていないので理解があいまいなままです。「実引数が仮引数にコピーされる」とはどういうことでしょうか?
4
2
 
5
3
  Pythonの説明としては、これは"嘘"でしょう。
@@ -14,29 +12,4 @@
14
12
  コピーされるのは「変数」ではないです。「値」です。
15
13
 
16
14
  「実引数が仮引数にコピーされる」は誤った認識からでてきた文です。
17
- 「値が、実引数から仮引数にコピーされる」の方がPythonの実行モデルには合っています。("コピーされる"が曖昧なままですが方便ですので)
15
+ 「値が、実引数から仮引数にコピーされる」の方がPythonの実行モデルには合っています。("コピーされる"が曖昧なままですが方便ですので)
18
-
19
- ----
20
-
21
- 入門python3はオライリーの本ですよね?
22
- p122に「実引数が仮引数にコピーされる」などと書いてある箇所はありません。
23
-
24
- > return inner2 という行は、このinner2関数のために専用のコピーを返す
25
-
26
- という箇所はありますね。
27
-
28
- しかしながら、それが書いてある箇所は、質問で引用されたソースの**次の**章です。
29
- 関数内関数の次の、クロージャについてのソースコード
30
-
31
- ```python
32
- def knigtes2(saying):
33
- def inner2(quote):
34
- return "We are the knights who say: '%s'" % saying
35
- return inner2
36
- ```
37
- に付された解説です。
38
-
39
- ここで"コピーされる"と説明されている対象は**inner2関数そのものです**。
40
- 引数についての説明された文ではありません。
41
-
42
- 文章に書かれていない文意を誤って読んでしまっていると思います。

2

些細

2020/02/12 00:09

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -10,7 +10,7 @@
10
10
  > (実)引数を渡して関数を呼び出すとき、それらの値は関数内の対応する(仮)引数にコピーされる
11
11
 
12
12
  とあります。
13
- コピーされるの主語を正しく取ってください。
13
+ "コピーされる"の主語を正しく読み取ってください。
14
14
  コピーされるのは「変数」ではないです。「値」です。
15
15
 
16
16
  「実引数が仮引数にコピーされる」は誤った認識からでてきた文です。

1

追記

2020/02/12 00:07

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -5,6 +5,17 @@
5
5
  Pythonの説明としては、これは"嘘"でしょう。
6
6
  まだよくわかってない人になんとなくイメージだけさせるための方便であって、実際にはそのようには動いていません。
7
7
 
8
+ p111
9
+
10
+ > (実)引数を渡して関数を呼び出すとき、それらの値は関数内の対応する(仮)引数にコピーされる
11
+
12
+ とあります。
13
+ コピーされるのの主語を正しく取ってください。
14
+ コピーされるのは「変数」ではないです。「値」です。
15
+
16
+ 「実引数が仮引数にコピーされる」は誤った認識からでてきた文です。
17
+ 「値が、実引数から仮引数にコピーされる」の方がPythonの実行モデルには合っています。("コピーされる"が曖昧なままですが方便ですので)
18
+
8
19
  ----
9
20
 
10
21
  入門python3はオライリーの本ですよね?