Python初心者がハマるポイントにしっかりハマってしまったので記録残しとく。
Pythonの関数引数にはデフォルト値が指定できる。
時刻指定する関数で、引数省略時は現在時刻を取得する関数を作ろうとした。
import time def tim(t=time.time()): print(t) if __name__ == "__main__": tim() time.sleep(1.25) tim() time.sleep(1.4) tim()
が、このtim関数を実行すると、同じ時間しか取得されない。
C:\>python.exe time_func_test.py 1414077198.46061 1414077198.46061 1414077198.46061
このデフォルト引数の値はモジュール評価時に決まるようで、一度関数を実行すると、後は決まった値が使用され続けるらしい。
上記の関数ではやってないけど、デフォルト引数にリストなどの可変オブジェクトを渡して、処理内でリストを更新すると、次の関数コール時は更新したリストが渡されてしまう。
元々やりたかった処理は、以下のような処理で実現した。
import time def tim(t=None): if t is None: t=time.time() print(t) if __name__ == "__main__": tim() time.sleep(1.25) tim() time.sleep(1.4) tim()
実行結果。毎回値が変わるようになったのでやりたいことは出来たっぽい。
C:\>python.exe time_func_test.py 1414078025.345443 1414078026.595514 1414078027.997595