0
0

[Python] 関数のデフォルト引数の挙動メモ

Last updated at Posted at 2023-11-16

はじめに

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()によって出力が決まってしまいます。
定義時に実行されてしまう事も知りませんでしたし、呼び出し時に値を渡してくれるものだと思っていました。

0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0