入門python3p122からです。
➀関数内関数の挙動なのですが、自分の理解は
「kの実引数'NI!'
はkの仮引数saying
にコピーされた後、iの仮引数quote
にコピーされ、%sに埋め込まれ返される」というところまでできています(間違っているかもしれませんが…)
この後はi(saying)となっていますが、iの仮引数はquoteなのでなぜ機能するのかが不明です。いったいこの関数はどのように機能しているのでしょうか(自分の理解度的に質問が少し抽象的になってしまいすみません。)
➁入門python3ではそもそも「実引数が仮引数にコピーされる」というような表現がされていましたが、いまいちピンと来ていないので理解があいまいなままです。「実引数が仮引数にコピーされる」とはどういうことでしょうか?
以上二点よろしくお願いいたします。
def k(saying): def i(quote): return "We are the knights who say: '%s'" % quote return i(saying) >>> k('NI!') "We are the knights who say: 'NI!'"
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
関数内関数といってもこの場合はただの関数とみなしていいのはLouiS0616さんの回答の通りです。
まず関数の概念から復習するといいでしょう。
kの実引数'NI!'はkの仮引数sayingにコピーされた後、
ここまではとりあえず良いと思いますが、
iの仮引数quoteにコピーされ、%sに埋め込まれ返される
という理解はたぶん間違っている気がします。後ろに
この後はi(saying)となっていますが
と書いてあるのが「正しくないんじゃないか」と判断した根拠です。「実引数が仮引数にコピーされる」のはi(saying)
が呼び出された後です。
投稿2020/02/11 04:13
総合スコア30935
0
少なくともご提示のコードについては、関数内関数であることはあまり動作に影響していないです。
次のように書いても同じような結果になる筈。
Python
1def i(quote): 2 return "We are the knights who say: '%s'" % quote 3 4def k(saying): 5 return i(saying) 6 7>>> k('NI!') 8"We are the knights who say: 'NI!'"
さて、改めて分からない点はあるでしょうか。
投稿2020/02/11 03:30
総合スコア35668
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/11 03:40 編集
2020/02/11 14:35 編集
2020/02/11 03:42
2020/02/11 03:47 編集
2020/02/11 04:02 編集
2020/02/11 06:48 編集
2020/02/11 06:59
0
➁入門python3ではそもそも「実引数が仮引数にコピーされる」というような表現がされていましたが、いまいちピンと来ていないので理解があいまいなままです。「実引数が仮引数にコピーされる」とはどういうことでしょうか?
Pythonの説明としては、これは"嘘"でしょう。
まだよくわかってない人になんとなくイメージだけさせるための方便であって、実際にはそのようには動いていません。
p111
(実)引数を渡して関数を呼び出すとき、それらの値は関数内の対応する(仮)引数にコピーされる
とあります。
"コピーされる"の主語を正しく読み取ってください。
コピーされるのは「変数」ではないです。「値」です。
「実引数が仮引数にコピーされる」は誤った認識からでてきた文です。
「値が、実引数から仮引数にコピーされる」の方がPythonの実行モデルには合っています。("コピーされる"が曖昧なままですが方便ですので)
➁入門python3ではそもそも「実引数が仮引数にコピーされる」というような表現がされていましたが、いまいちピンと来ていないので理解があいまいなままです。「実引数が仮引数にコピーされる」とはどういうことでしょうか?
Pythonの説明としては、これは"嘘"でしょう。
まだよくわかってない人になんとなくイメージだけさせるための方便であって、実際にはそのようには動いていません。
p111
(実)引数を渡して関数を呼び出すとき、それらの値は関数内の対応する(仮)引数にコピーされる
とあります。
"コピーされる"の主語を正しく読み取ってください。
コピーされるのは「変数」ではないです。「値」です。
「実引数が仮引数にコピーされる」は誤った認識からでてきた文です。
「値が、実引数から仮引数にコピーされる」の方がPythonの実行モデルには合っています。("コピーされる"が曖昧なままですが方便ですので)
やっぱり「方便としての嘘」なのが気になったので、上の最後の方を取り消し線にしました。
pyhton
1a = [] //★1 2 3b = a //★2
とした時「値がaからbにコピーされている」というようなことは決して起こっていません。
この時、★1の右辺で作られたリストのオプジェクトがあって、★2によってaもbもその同じオブジェクトを指している/参照している/束縛している、という状態になります。
より精確には「右辺のaを評価してでてきた値」をbに束縛する、という動作がなされます。
だから、
python
1b.append(1) //★3 2 3print(a) //★4
とすると★3で「aとbが指しているリストのオブジェクト」に追加されるので、★4は[1]
という結果になります。
python
1b = [] //★5 2 3b.append(2) //★6 4 5print(a) //★7
とすると★5で新しく別のリストオブジェクトが作られて、aは★1で作られたオブジェクト、bは★5で作られたオブジェクトを指している、という状況になります。だから★6でリストに2を追加してもaが指しているオブジェクトには影響がなく、★7の結果は[1]
のままです。
さて。
関数呼び出しをした時の、実引数から仮引数への受け渡しの挙動は★2で起こることにそっくりです。
呼び出された側の関数のローカルな名前空間上の名前 = 呼び出した側の引数を評価した値
ということが起こっています。
k('NI!')
という式を評価すると、「式'NI!'
を評価したオブジェクト」が「kの実行時にできるローカルな名前空間」にsayingという名前で束縛されて、そののちkの本体が実行されます
i(saying)
という式を評価すると、「式'saying
を評価したオブジェクト」が「iの実行時にできるローカルな名前空間」にquoteという名前で束縛されて、そののちiの本体が実行されます
投稿2020/02/12 00:01
編集2020/02/13 00:14総合スコア11235
0
仮引数と実引数のところだけ説明してみます。
とは言っても、検索して出てくるようなことしか書きませんが。
まずは「引数」です。関数というのは、うけとった引数やその他の情報を使って、何かをしたり、値を返すものです。
例えば、「2を足す」という関数を考えます。
この関数に5を引数として渡すと7が返ります。 このときの「5」を実際に動作するときの引数なので「実引数」と呼びます。
実引数には変数を使うこともできますが、この時に渡されるのは変数そのものではなくて、その変数が示しているものです。
たとえばi(saying)
としたときに関数i に渡されているのはsaying
ではなくて、そのときのsaying
の値であるNI!
です。
さて、「2を足す」という関数を定義する場合には、一時的にその引数を入れておく変数を定義します。 この変数を「仮引数」と呼びます。
i関数を定義するときに使っているquote
がこの場合の仮引数です。
i('Hello')
と呼ばれたときには、quote
にHelloという文字列が入り、i('Bye')
と呼ばれたときには、quote
にByeという文字列が入り、i(greeting)
と呼ばれたときには、quote
にその時にgreetengという変数に入っている値が入り、i(saying)
と呼ばれたときにはquote
にその時にsayingという変数に入っている値が入るということです
もし、コピーという言葉にひっかかっているのであれば、あまり気にしなくてもいいと思います。たぶんsaying
に入っていた値がi
関数に渡されるてもsaying
に入っていた値はなくならないよということを表したかっただけだと思います。
投稿2020/02/11 14:17
編集2020/02/12 14:38総合スコア13792
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/11 14:29
2020/02/12 14:32
2020/02/15 10:00
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/11 14:40
2020/02/11 22:55
2020/02/15 10:07
2020/02/16 00:27
2020/02/16 08:39
2020/02/16 08:52
2020/02/16 08:55
2020/02/16 09:55
2020/02/16 11:46
2020/02/16 14:29