関数の結果を呼び出し元に返す方法を説明します。
前提知識
pythonでは、引数はオブジェクトの参照が代入によって渡されます。
前提として、Python では引数は代入によって渡されます。代入はオブジェクトへの参照を作るだけなので、呼び出し元と呼び出し先にある引数名の間にエイリアスはありませんし、参照渡しそれ自体はありません。望む効果を得るためには幾つかの方法があります。
プログラミング FAQ — Python 3.10.0b2 ドキュメント https://docs.python.org/ja/3/faq/programming.html#how-do-i-write-a-function-with-output-parameters-call-by-reference、出力引数のある関数 (参照渡し) はどのように書きますか?
下記コードで、「引数はオブジェクトの参照が代入によって渡される」ことがわかります。
def main(): inputStr = "this is input" print("main: id(inputStr) = ", id(inputStr)) func(inputStr) if id(inputStr) == id("this is input"): print("\n下記より、argument1にはinputStrの参照が代入されていたことがわかります。func内でargument1 = \"argument is changed\"をしたが、inputStrが指すオブジェクトは変わっておらず、argument1が指すオブジェクトのみ変わったため。") print("main: id(inputStr) = ", id(inputStr), "#\"this is input\"は変更されていない。") print("main: id(\"this is input\") = ", id("this is input"), "#\"this is input\"は変更されていない。") def func(argument1): print("func: id(argument1) = ", id(argument1), "#オブジェクトの参照が渡されているとわかります(main関数で与えた引数とidが一致しているため)。") argument1 = "argument is changed" print("\nargument1に文字列を代入") print("func: id(argument1) = ", id(argument1), "#argument1に文字列を代入することで、idが変わった(argument1が指すオブジェクトが変わった)。") print("func: id(\"argument is changed\") = ", id("argument is changed"), "#argument1は\"argument is changed\"を指している。") if __name__ == "__main__": main() """出力 main: id(inputStr) = 140384642005552 func: id(argument1) = 140384642005552 #オブジェクトの参照が渡されているとわかります(main関数で与えた引数とidが一致しているため)。 argument1に文字列を代入 func: id(argument1) = 140384641989648 #argument1に文字列を代入することで、idが変わった(argument1が指すオブジェクトが変わった)。 func: id("argument is changed") = 140384641989648 #argument1は"argument is changed"を指している。 下記より、argument1には、inputStrの参照が代入されていたことがわかります。func内でargument1 = "argument is changed"をしたが、inputStrが指すオブジェクトは変わっておらず、argument1が指すオブジェクトのみ変わったため。 main: id(inputStr) = 140384642005552 #"this is input"は変更されていない。 main: id("this is input") = 140384642005552 #"this is input"は変更されていない。 """
関数の結果を呼び出し元に返す方法
下記の方法等があります。
- 結果のタプルを返す。
- グローバル変数を使う。
- ミュータブルなオブジェクト(リスト等)を引数として渡す。
- main関数のミュータブルなオブジェクト(obj)を関数Aのarg変数に渡すとします。関数A内でargの要素を変更した場合、objと同じオブジェクトを変更することになります。そのため、関数A内のミュータブルなオブジェクトの変更結果をmain関数に反映することができます。
- 右記が参考になります。プログラミング FAQ — Python 3.10.0b2 ドキュメント https://docs.python.org/ja/3/faq/programming.html#why-did-changing-list-y-also-change-list-x
詳細は、下記を参照してください。
プログラミング FAQ — Python 3.10.0b2 ドキュメント https://docs.python.org/ja/3/faq/programming.html#how-do-i-write-a-function-with-output-parameters-call-by-reference
参考
python: how to change the value of function’s input parameter? – Stack Overflow https://stackoverflow.com/questions/55275110/python-how-to-change-the-value-of-functions-input-parameter
python – How do I pass a variable by reference? – Stack Overflow https://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference
コメント