Никогда не думайте, что «a = b» в Python означает «скопировать b в a». Если с обеих сторон есть переменные, вы не можете этого знать. Вместо этого думайте об этом как «дайте b дополнительное имя a».
Если b является неизменным объектом (например, числом, кортежем или строкой), тогда да, вы получите копию. Но это потому, что когда вы имеете дело с неизменяемыми (которые, возможно, следовало бы назвать только для чтения , неизменяемым или WORM ), вы всегда получаете копия, по определению.
Если b является изменяемым, вы всегда должны делать что-то дополнительное, чтобы убедиться, что у вас есть истинная копия . Всегда . Со списками это так же просто, как срез: a = b [:].
Изменчивость также является причиной того, что это:
def myfunction(mylist=[]):
pass
... не совсем так, как вы думаете.
Если вы из C-фона: то, что осталось от '=', это всегда указатель. Все переменные являются указателями, всегда. Если вы помещаете переменные в список: a = [b, c], вы помещаете указатели на значения, на которые указывают b и c в списке, на который указывает a. Если затем вы установите a [0] = d, указатель в позиции 0 теперь указывает на то, на что указывает d.
См. Также копировальный модуль: http://docs.python.org/library/copy.html