python プログラミング作法
リストなど変数に代入するのは、参照のコピーでしかない。 これは、関数、メソッドの呼び出しで引数を渡すのも同じこと。 渡したつもりで、参照がコピーされただけなので、メソッドの中で引数が変化すれば参照元も変化して見える。 これを知らなければ、 >>> a=[1,2,3] >>> b=a >>> b [1, 2, 3] >>> b[1]=11 >>> a [1, 11, 3] >>> b [1, 11, 3] >>> という、不可解な現象に悩むことになる。 これは、bには、aから[1,2,3]への参照と同じ参照が渡されるだけだからだ。 これだけ見ると、どうしてこうゆう仕様になっているのか不思議だが、メソッドの引数渡しでもこの動きはあって、 def func_a(rec): rec[1]=22 a=[1,2,3] print a func_a(a) print a ーーーー [1, 2, 3] [1, 22, 3] からわかるとおり、メソッドの受け取った引数recはローカル変数かと思いきや、参照しか渡されていないので、メソッドの中で引数を変更すると、メインルーチン側でも変数が変化していることがわかる。 そうすると、メソッドと上位ルーチン間での引数、リターン値のやり取り方法にいくつか方法が考えられる。
結果 [1, 3000002, 3]elapsed_time:1574.20301437[ms] [1, 3000002, 3] elapsed_time:1273.03004265[ms] [1, 3000002, 3] elapsed_time:2094.46501732[ms] [1, 3000002, 3] elapsed_time:1342.04602242[ms] [1, 3000002, 3] elapsed_time:1299.40485954[ms] 一番早いのは、way4の、グローバル変数をメソッドの中でそのまま変更する方法。 だがこれは何やってるのかソースの可読性が悪い。 一番遅いのは、way2-1のループの中に代入がある方法。 普通は、way1の、引数とリターンを使う方法。 以上で分かるように、出来るだけ、値のコピーをしないほうが速度が向上する。 pythonの解析サイトで、「代入が参照なので、気をつけるように」というのはよく解説されていることだが、どうしてそうなっているのかの理由まで言及しているところが見当たらない。 現象としては、「代入文の右辺が左辺に影響される」という現象がよく言われるのだが、実はこれは副作用ではないかと思う。 やりたかったのは、メソッドへの引数をコピーなしに渡したい、ということではなかったかと思う。 代入文で右辺が左辺に影響されるというのは、バグを誘発する要因でしかないが、メソッドへの引数がコピーなしに渡せるというのは思想だと思う。 それだけに、その思想は理解しないと、変数のスコープが曖昧だというデメリットばかりが目にについてしまう。 先ほどの実験でも、なるべく値のコピーを発生させないようなコーディングのほうが早いというのが見て取れた。 引数渡しは、変数がグローバルかローカルかというのより上位の概念のようで、変数名にかかわりなく、参照がコピーされるだけだ。 プログラミング作法としては、メソッドの中の引数は、ローカルではなくグローバルのつもりでアクセスすることが必要だし、必要ない中間の変数をやたらと生成しないようにするほうが良い。
by studio_do
| 2019-12-31 19:58
| 機械室から
|
Comments(0)
|
カテゴリ
以前の記事
2024年 03月 2024年 01月 2023年 06月 2023年 05月 2023年 02月 2022年 12月 2021年 11月 2021年 10月 2021年 07月 2021年 02月 2020年 10月 2019年 12月 2019年 11月 2019年 09月 2019年 07月 2018年 06月 2018年 02月 2017年 11月 2017年 10月 2017年 08月 2017年 07月 2017年 06月 2017年 03月 2017年 02月 2017年 01月 2016年 10月 2016年 09月 2016年 08月 2016年 06月 2016年 03月 2015年 06月 2015年 04月 2015年 03月 2014年 07月 2013年 12月 2013年 04月 2012年 09月 2012年 04月 2012年 03月 2012年 02月 2012年 01月 2011年 12月 2011年 11月 2010年 12月 2009年 09月 2009年 03月 2008年 12月 2008年 05月 2008年 01月 2007年 12月 2007年 04月 2006年 12月 2006年 10月 2006年 06月 2006年 05月 2006年 04月 2006年 03月 2006年 02月 2006年 01月 2005年 10月 2005年 03月 フォロー中のブログ
ライフログ
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧
|
ファン申請 |
||