デフォルト引数で失敗した

2009-10-19 追記
コメントで指摘してもらっているようにデフォルト引数ではなくて、キーワード引数の問題だった。
よく分からないものを無理して使った上に、ブログに間違いを載せるとか、恥の上塗りでしかなかった。



最近は特に勉強もせず、ネトゲやったりしてダラダラ過ごしてしまっている。
そんな中、ちょっとしたミスからなかなかバグがとれなかったので、ここに晒して戒めとしよう。
それは似たようなコードをC++Pythonで使い回していて、次のような関数のデフォルト引数を使ったコードで発生した。

# Python

def func(a = 10):
	print(a)

def main():
	a = 20

	func(a = 30)
	print(a)

if '__main__' == __name__:
	main()
// C++

#include <iostream>

using namespace std;

void func(int a = 10) {
	cout << a << endl;
}

int main() {
	int a = 20;

	func(a = 30);
	cout << a << endl;

	return 0;
}

出力は以下の通り。

Python
    30
    20

C++
    30
    30

このコードなら大した話ではないので間違いにはすぐ気がつくが、他のロジックに混ざっていると突然変数の中身が変化したような錯覚に。
根本的には、変数名の付け方が悪かったことに起因するんだろうなぁ。