def culc(a, b=1, squares=[], cubes=[]): squares.append(a ** 2) cubes.append(b ** 3) return squares, cubes print(culc(1)) print(culc(2, 3)) print(culc(3, 4)) print(culc(4, 5)) defの中のsquaresのリストは、初期化されないの?

はい、defの中のsquarescubesは関数が定義されるときに一度だけ初期化されます。ただし、デフォルト引数としてリストを指定すると、そのリストは関数が定義されるときに一度だけ作成され、その後は同じオブジェクトが再利用されます。

以下は、squarescubesが初期化されるタイミングとリストの状態を示す例です。

python
def culc(a, b=1, squares=[], cubes=[]): squares.append(a ** 2) cubes.append(b ** 3) return squares, cubes # 最初の呼び出し print(culc(1)) # ([1], [1]) # 2回目の呼び出し print(culc(2, 3)) # ([1, 4], [1, 27]) # 3回目の呼び出し print(culc(3, 4)) # ([1, 4, 9], [1, 27, 64]) # 4回目の呼び出し print(culc(4, 5)) # ([1, 4, 9, 16], [1, 27, 64, 125])

この結果を見ると、squarescubesのリストは関数が初めて呼び出されたときに初期化され、以降の呼び出しで前の呼び出しの結果が保持されていることがわかります。これはデフォルト引数が一度だけ初期化されるためです。

未分類

Posted by ぼっち