Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python入門】関数にデフォルト引数を設定する方法と落とし穴の回避策

Pythonにおけるデフォルト引数(デフォルトパラメータ値)の扱いは、多くの初心者がつまずきやすいポイントの一つです。

問題となるのは「ミュータブル」なデフォルト値

トラブルの原因になるのは、ミュータブル(可変)なオブジェクトをデフォルト値として指定するケースです。ミュータブルとは、リストや辞書のように、生成後に中身をその場で変更できるオブジェクトのことを指します。

たとえば、第2引数が省略された場合に「呼び出すたびに新しいリストが作られる」と期待してコードを書くと、本来は次のような出力を想定しているはずです。

[12]
[43]

実際に起こること

しかし実際のPythonでは、リストは関数が定義された時点で一度だけ作成され、以降の呼び出しでは毎回同じリストが使い回されます。

これは、Pythonのデフォルト引数が「関数を呼び出すたび」ではなく「関数を定義したときに一度だけ」評価されるためです。そのため、ミュータブルなデフォルト引数の中身を変更すると、その変更は以降のすべての関数呼び出しにも影響してしまいます。

正しい対処法

推奨される解決策は、デフォルト値として None を指定し、「引数が渡されなかった場合だけ」関数内で新しいオブジェクトを作成する方法です。None はイミュータブルなので安全であり、この用途で広く使われています。

悪い例

def func(data=[]):
    data.append(1)
    return data

func()
func()  # 前回の呼び出し結果が残ってしまう

良い例

def append2(element, foo=None):
    if foo is None:
        foo = []  # 呼び出しごとに新しいリストを作成
    foo.append(element)
    return foo

print(append2(12))
print(append2(43))

実行結果

[12]
[43]

このように None を番兵(センチネル)として使うことで、毎回独立した新しいリストが生成され、意図どおりの動作になります。辞書やセットなど、他のミュータブルなオブジェクトをデフォルト値にしたい場合も同様の手法が有効です。

  1. Python Matplotlibで多変量関数をプロットする方法

    Pythonで多変量関数(複数の変数を持つ関数)を視覚的に表現したい場合、Matplotlibの散布図を活用すると、x・y・zの3つの変数の関係を1つのグラフ上で直感的に把握できます。ここでは、具体的な手順とサンプルコードを交えて解説します。実装の手順図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。NumPyを使って、ランダムな x、y、z のデータ点を生成します。図(figure)とサブプロット(axes)のセットを作成します。x・y・z のデータ点をもとに散布図を描画します。ScalarMappableインスタンス s に対してカラーバーを作成し、z値の色の対

  2. 【Python】MatplotlibでX軸の値(目盛りラベル)を設定する方法

    Python の Matplotlib でグラフの X 軸の値(目盛りラベル)を自由に設定したい場合は、plt.xticks() メソッドを使うのが最も簡単です。以下の手順で実装できます。 X軸の値を設定する手順 x と y のデータポイントを格納する2つのリストを作成します。 range(len(x)) を使って、目盛りの基準となるインデックス(xticks の範囲)を取得します。 plot() メソッドで、インデックスのリストと y データを使って折れ線グラフを描画します。 xticks() メソッドを使い、デフォルトの目盛りを実際の X 軸の値に置き換えます。 show() メソッドで