2018.08.04引数のディフォルト値を設定し、関数内でその変数を変更すると、次に関数を呼び出すとき、ディフォルト値が変化する場合と変化しない場合があります。これは、理由を理解するとシンプルです。どんな場合にディフォルト値が変わってしまうのかがわかるようになります。この記事を読む前に、以下の記事に目を通してください。この記事は様々な場面でPythonの理解の手助けをしてくれる記事です。参考記事:「参照渡し後の要素の変更」と「参照渡し後の再定義」の違い今回の記事で重要なのは、以下12です。1ディフォルト値の評価は、関数を定義した時点で一度だけ起こる。2ディフォルト値の参照は、関数の起動のたびに同じ参照先アドレスから値を呼び出すだけであり、ディフォルト値が同じ値に固定されるのではありません。「関数の定義」と「関数の呼び出し」の違いまず、プログラムが実行される順番と、「関数の定義」「関数の呼び出し(コール)」のタイミングについて理解しましょう。「関数の定義」「関数の呼び出し(コール)」という言葉は、同じように見えてしまうかもしれませんが、そのタイミングが違いますので、その違いを理解しながら考える必要があります。プログラムは前から順番に実行するのが原則です。コード01について、実行順序を追っていきましょう。このプログラムは出力が2ではなく、1になっているのがポイントです。2」と考えるのは間違いです。矢印とか入れるのはプラグインでは難しいので頑張りました!1.関数の前まで実行プログラムは、前から実行するのが原則です。プログラムのメインの部分である6行目から実行するのではありません。次に、関数部分の3~4行目までが実行されますが、ここで、「関数の定義」が行われます。関数xxx()がどんな関数なのかをコンピューターが理解します。「関数の定義」を行うだけなので、「関数の実行」はされません。iがディフォルト値の設定部分です。ディフォルト値を設定することで、関数を呼び出すときにaの値を渡さなくても値を設定することができます。ここで、重要なのは、ディフォルト値の評価は「関数を定義」した時点で1度だけ行われるということです。1なので、aのディフォルト値は1となります。「関数の定義」が、どのタイミングなのかが分からなければ、頭の中がごちゃごちゃになってしまいます。関数の呼び出し行の手前6行目まで実行します。4.関数の呼び出し(コール)7行目で関数が呼び出されています。「関数の呼び出し(コール)」によって、はじめて、関数が実行されます。ここでは「関数が定義」されているのではありません。「関数の定義」「関数の呼び出し(コール)」「関数の実行」を混同しないようにしましょう。関数の実行により、実行の行が3~4行目に移ります。関数の実行が終了すると、関数の呼び出し位置の直後から実行が再開されます。いかがですか?今回の例題のように、コードの実行の順序を意識してプログラムを読まないと、理解しにくいケースがあります。ディフォルト値が変わる場合と変わらない場合があるさて、いよいよ本題です。ディフォルト値が変わってしまう場合と変わらない場合の違いを見ていきたいと思います。ディフォルト値が変わる場合です。1.ディフォルト値が変わるケースコード02では、関数xxx()の変数aのディフォルト値が[3]となっています。関数内でaの要素の変更(a[0]=5)を行うことで、2回目に関数を呼び出した時にはディフォルト値が[5]になってしまいました。呼び出すたびに同じ値にしたいと思っていた人には驚きの実行結果です。5xxx()xxx()#出力02[3][5]コード02の変数aの変化を下図にまとめました。「関数の定義」のときにaのディフォルト値[3]をメモリのアドレス(i番地)に記憶します。次に「関数の呼び出し」のときに、i番地の[3]をaに読み込みます。この変更は「要素の変更」ですので、変数の参照先アドレス(i番地)は変更されません。5では、ディフォルト値が保管されいるi番地の値[3]が[5]に変わってしまうのです。したがって、次回、関数を呼び出すときには、変更された[5]が呼び出されます。ここで、重要なのは、以下12の2点です。1ディフォルト値の評価は、関数を定義した時点で一度だけ起こる。2ディフォルト値の参照は、関数の起動のたびに同じ参照先アドレスから値を呼び出すだけであり、ディフォルト値が同じ値に固定されるのではありません。ディフォルト値が設定されている変数について、関数内で「要素の変更」を行うと次回関数を呼び出すときにディフォルト値が変わってしまうのです。ここの説明がわかりにくい人は、やはり、以下の記事を先に読みましょう。参考記事:「参照渡し後の要素の変更」と「参照渡し後の再定義」の違い2.ディフォルト値が変わらないケースコード03では、関数xxx()の変数aのディフォルト値は3です。コード02とは違い、関数内でaの要素の変更(a=5)としても、2回目以降のディフォルト値は3のまま変わりません。コード02の結果と違うのでしょうか。5xxx()xxx()#出力0333それは、先ほどは関数の中で「要素の変更」を行ったのに対して変数の「再定義」を行ったからです。「変数の再定義」は、今の場所を消して上書きするのではなく、現在の記憶場所を放置し、別の記憶場所に定義し直します。「変数の再定義」では、ディフォルト値が記憶されているi番地の値は3のまま変更されないのです。3がディフォルト値となります。ディフォルト値に変更不能体(イミュータブル)を設定した場合は、i番地の値を変更することができませんので、関数内での変更は必ず「再定義」となります。ディフォルト値が変更されることはありません。[5])を行った場合は、ディフォルト値が変更されません。まとめそれでは、以下、「関数の定義」「関数の呼び出し」「関数の実行」の違い、ディフォルト値の設定の重要ポイント、ディフォルト値が変わる場合、変わらない場合について説明します。1.「関数の定義」「関数の呼び出し」「関数の実行」の違いコンピューターが関数が記述された部分を読み込んだ時に「関数の定義」が行われます。「関数の定義」では、コンピューターが関数の内容を理解するだけで「関数の実行」は行われません。関数が実行されるのは、「関数を呼び出す」命令を実行した直後です。※この記述はコードを見た方が早いかもしれません。コード01の説明を見てください。2.ディフォルト値の設定の重要ポイント引数のディフォルト値を設定すると、関数を呼び出す側で設定しなくても、ディフォルト値を使って実行してくれます。関数を呼び出す側で引数を設定すれば、ディフォルト値は無視し、設定した値で関数を実行します。ディフォルト値の設定で、重要なのは、以下12の2点です。1ディフォルト値の評価は、関数を定義した時点で一度だけ行われる。2ディフォルト値の参照は、関数の起動のたびに同じ参照先アドレスから値を呼び出すだけであり、ディフォルト値が同じ値に固定されるのではありません。→これが「要素の変更」になることは覚えよう。→これが「要素の変更」になることは覚えよう。ディフォルト値を与えられた変数を、関数の中で「再定義」した場合。※ディフォルト値に変更不能体を設定した場合、関数内での変更は必ず「再定義」になります。したがって、ディフォルト値が変化することはありません。=」となっているものは「再定義」です。ディフォルト値を与えられた変数を、関数の中で「再定義」した後に「要素の変更」を行た場合。このように、「要素の変更」と「再定義」の違いを参照先アドレスが変化するかどうかに注目して理解することは重要です。引数のディフォルト値だけではありません。以下の記事も同様の考え方で考えることができます。関数に引数で渡された変数の変更が、関数の外側に与える影響。10.6.数学」に出てくるrandomモジュールの関数を整理してみました。randomモジュールには、他にも、便利な関数が多くありますが、まずは、この記事に出てくる関数から覚えてはいかがで...PythonPython♪FEM:微小変形の仮定と人の感覚の違い有限要素法のプログラムの自作にチャレンジするなら、「微小変形」は必ず理解しましょう。人間の感覚とずれているので知らなければ苦労します。解析では常識に近い初歩的な内容なので書籍やサイトなどでも説明が省略されていることが多いです。assignment関数を使っていたら変なエラーが出てきました。'x'」なる...PythonPython♪本当は変数には参照先のアドレス(id)しか入っていない変数aに整数3を代入するとは、aという名前の箱に整数3を入れるようなイメージですが、実際にはそうではありません。整数オブジェクト3が別のところに独立して生成され、変数aには整数オブジェクトの保存先のアドレス(id)のみが記述されます。この...PythonPython♪2ヶ月ぐらい更新ができなかったので雑談です雑談です。技術的な内容ではありません。2018年6月18日からホームページをはじめ、1年半ぐらい経過しました。ホームページを続けてきましたが、更新が2ヶ月ぐらい空いてしまい、ちょっと、とりとめもない記事も書いてみたくなりました。Studioが遅いときの対策2020.01.11Kotlin♪環境設定「HAXMがインストールされていません」2020.01.052020.01.08Python♪FEM:部材座標系の要素剛性マトリクス2020.01.04Kotlin♪スマホアプリの言語は、Kotlin、Java、C#、Dart?2020.01.012020.01.13スポンサーリンクスポンサーリンク。