Объявляю функцию:
def f(x = []):
print 'x:',x
x.append(123)
print 'now x:',x
И вот что получается: если вызываю её, явно указывая значение x, то всё работает нормально. Если же не указываю, то, похоже, для x всегда берётся специальная глобальная переменная, причём даже если эта функция является методом класса - значение будет общим для всех экземпляров класса.
>>> f([2])
x: [2]
now x: [2, 123]
>>> f()
x: []
now x: [123]
>>> f()
x: [123]
now x: [123, 123]
>>> f()
x: [123, 123]
now x: [123, 123, 123]
>>> f([43])
x: [43]
now x: [43, 123]
Это бага или фича? Казалось бы, указывая при объявлении функции "x=", я предполагаю, что если её вызовут как f(), то аргумент получит значение . А получается по-другому…
Проверил, в python3 то же самое.
Пока придумал такой костыль: либо в начале делать x=x (для словарей - x=x.copy()), либо (не всегда подойдёт) в конце - x=… Но это неочевидно.