読者です 読者をやめる 読者になる 読者になる

mokky14's IT diary

IT関係の仕事メモ、勉強会の感想など書いてます。

Pythonのデフォルト引数にハマった

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


参考:
Python初心者によるPythonのいいところ、はまりどころのまとめ - Webtech Walker