Списки в питоне передаются по ссылке. Это значит, что передавая список в функцию, будет меняться переданный список, а не создаваться "копия" внутри функции.
Если же ты хочешь создавать новый список, то в функцию надо передавать полную(глубокую) копию исходного списка, или создавать такую копию внутри функции и выполнять операции над ней.
12oad: Что такое ссылка - читай в вики. В твоём случае самым простым способом, если внутри списка не содержатся неплоские типы данных (те, которые передаются ссылками), будет после объявления функции сделать поверхностную копию списка: a = a[:]
12oad: короче, простым языком: в питоне есть изменяемые и неизменяемые типы. неизменяемые типы - инты, флоаты, булеаны и м.б что-то еще. Когда ты передаешь их в функции по сути передается их копия. Изменяемые типы: списки, словари, объекты. Передавая их в функцию - передается не копия, а ссылка на этот объект в памяти (область памяти, которая выделена под объект). И работа выполняется с этой областью памяти. Соответственно если в этой области памяти данные меняются, то меняется содержимое объекта. Как проще объяснить я не знаю.
Евгений Корначев: Ещё строки, кортежи, frozenset'ы, функции, генераторы, None, True, False и всё остальное, для чего функция hash() не кидает эксепшн. Но главное, что строки и кортежи - неизменяемые типы.