見出し画像

Python は Call by Object Reference (オブジェクト参照渡し) と呼ぶべきかもしれない。。。

Pythonの関数コールは、値渡し(Call by Value)? それとも参照渡し(Call by Reference)?、、、 に自分なりに白黒付ける為に、気持ちチョットだけ考察してみまふた。。。


【Pythonチュートリアル第3版】⸢4.6 関数の定義⸥ の原注には、以下のようにありまふ。⸨一部引用⸩


これは実のところ、Call by Object Reference (オブジェクト参照渡し) と呼ぶべきかもしれない。

はい答えが見つかりました❨笑❩

で、、、考察を終えるわけにはいかないので、考察を続けまふ。。。

【Pythonチュートリアル第3版】⸢4.6 関数の定義⸥ には、以下のようにありまふ。⸨一部引用⸩

関数の実行により新しいシンボル表が導入され、これは関数内のローカル変数に使われる。より正確に言うと、関数内でのあらゆる代入は、その値がローカル変数のシンボル表に格納される。

言い換えると、、、もっとも内側の関数内スコープのシンボル表が、関数が実行される度に作られるのでしょう…(たぶん💦

という事で、、、このシンボル表と、関数の引数の関係が分かれば、今回の答えが見つかりそうな気がしてきまふた。。。


【Pythonチュートリアル第3版】⸢4.6 関数の定義⸥ には、以下のようにありまふ。⸨一部引用⸩

関数をコールするときに渡される実引数は,コールの時点でその関数にローカルなシンボル表に加えられる。つまり Call by Value で渡される(この Value とは、常にオブジェクトの参照のことであり、オブジェクトの値そのものでははい)。

カッコ内の文章、、、なんだかなあ〜でふね、オブジェクトの値じゃなくオブジェクトの参照を値として渡すなら Call by Reference でふよね…(たぶん💦

という事で、、、渡される ⸢オブジェクトの参照⸥の正体 が分かれば、スッキリしまふ。。。

見つけまふた。。。


【Pythonチュートリアル第3版】⸢9.1 名前とオブジェクトについて一言⸥ には、以下のようにありまふ。⸨一部引用⸩

たとえばオブジェクト渡しが安価な操作なのは、実装上はポインタ渡しであるためだ。またオブジェクトを渡された関数がこれを変更すると、渡した側(呼び出し元)でもその変化を読み取れるーーこのことは、Pascal などにある2種の引数渡しメカニズムというものを不要にしている。


この内容から⸢オブジェクトの参照⸥ の正体が実装上はポインタである事が分かりました。

C言語で実装するなら、、、全て void * で渡して、受け取った関数側でキャストして使うといったところでしょうか?

という事で、、、ズバリ Call by Reference でふ!


§ 考察のまとめ §

関数をコールするときに渡される実引数は、全てオブジェクトの参照で、実装上はポインタ渡しである。
 
よって、参照渡し(Call by Reference) である。

なお、常にオブジェクトの参照が渡されるので、グイド・ヴァンロッサム氏は、Call by Object Reference (オブジェクト参照渡し) と呼ぶべきかもしれないと考えている。


という訳で、、、気持ちチョットだけ考察しただけなので、間違ってたらゴメンナサイ(._.)でふ。。。


#Chromebook#Python #Python3 #プログラミング を勉強中 !

#値渡し

#CallbyValue

#参照渡し

#CallbyReference

#オブジェクト参照渡し

#CallbyObjectReference