LoginSignup
3
2

More than 3 years have passed since last update.

Pythonの引数評価戦略は"参照渡し"ではないと何度でも主張すべきそうすべき

Posted at

Google検索すると、いまだにPythonの引数は参照渡しされるとする記事が後を絶たないので注意喚起。

なんで?

A. 公式ドキュメントにそう書かれているからです。

まず、当該部分の原文はこう。

How do I write a function with output parameters (call by reference)? - Programming FAQ — Python 3.8.8 documentation

Remember that arguments are passed by assignment in Python. Since assignment just creates references to objects, there’s no alias between an argument name in the caller and callee, and so no call-by-reference per se. You can achieve the desired effect in a number of ways.

Pythonに"call-by-reference"自体は存在しないとはっきり書かれています。

そして、当該部分の日本語訳は次のようになっています。

出力引数のある関数 (参照渡し) はどのように書きますか? - プログラミング FAQ — Python 3.8.8 ドキュメント

前提として、Python では引数は代入によって渡されます。代入はオブジェクトへの参照を作るだけなので、呼び出し元と呼び出し先にある引数名の間にエイリアスはありませんし、参照渡しそれ自体はありません。望む効果を得るためには幾つかの方法があります。

少なくともPythonのドキュメントにおいては"call-by-reference"="参照渡し"であり、そしてそれはPythonにはないと書かれていることがわかります。

Q1. 日本語訳と行っても所詮は非公式では?

Pythonにおいて、日本語を含むいくつかの翻訳版ドキュメントはPEP 545を通してPythonソフトウェア財団の活動に取り込まれた公式ドキュメントです。1
そこで用いられている用語の定義に異議があるならば、寄稿規約に従ってIssueを立て修正の合意を取り付ける必要があります。

Q2. 評価戦略の用語は混乱しがちなので、言語固有の事情に従って説明すべきでは?

私もそう思います。
ただ、言語公式のドキュメントで表明されているからにはそれに従うのが正しいと思います。

Q3. じゃあPythonの引数評価戦略はなんなの?

先の引用の通り、Pythonにおける引数は代入であるとされていますが、具体的にこの戦略の名前が明記されているわけではありません。振る舞いとしては"call-by-sharing"などと称される戦略と同じですが、この用語が公式ドキュメント中で用いられているわけでもないようです。誤解を生まない範囲で自由な語句を使って表現すればよい、というところですが、それが簡単にできるならきっと本稿も無用の長物なのでしょう。


そんな訳で、『Pythonの引数は参照渡し』は明確に誤りです。
特に新人の方は公式ドキュメントをよく読んで、正しい知識を身につけることを大事にしましょう。


  1. 余談ですが、日本語は原文を除けばもっとも翻訳完了率の高い言語だそうです。翻訳プロジェクトの方々には頭が上がりません。 

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2