はじめに
Pythonで関数のデフォルト引数にリストなどのミュータブルな物は渡してはいけない事は、リンターが警告を出してくれていたので知っていました。
しかし、関数を実行する事でデフォルト値を渡す事がトラブルの元になる事は知りませんでした。
備忘録として記事にします。
リンタの設定を見直すべきですね。
環境
py -VV
Python 3.11.4 (tags/v3.11.4:d2340ef, Jun 7 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)]
コード
import time
from datetime import datetime
def now():
print("now")
return datetime.now()
def test1(l=[]):
l.append("hage")
print(l)
def test2(t=now()):
print(t)
test1()
test1()
test2()
time.sleep(10)
test2()
実行結果例
実行結果
now
['hage']
['hage', 'hage']
2023-11-17 01:08:56.144717
2023-11-17 01:08:56.144717
解説
test1()
は、ミュータブルなリストを渡しているので、呼び出す毎に"hage"が増えてしまいます。(オソロシイ)
test2()
は、関数呼び出し時の時間を出力して欲しい所ですが、関数定義時に一度だけ実行されたnow()
によって出力が決まってしまいます。
定義時に実行されてしまう事も知りませんでしたし、呼び出し時に値を渡してくれるものだと思っていました。