Решение для понимания списка - самое питонское, но есть важный поворот:
mylist[:] = [s.replace(':', '') for s in mylist]
Если вы присваиваете mylist
пустое имя, как в другом ответе, а не mylist[:]
, «срез целого списка», как я рекомендую, вы действительно делаете что-то совсем другое, чем «замена» записи в списке": вы создаете новый список и просто привязываете прежнее имя, которое ранее использовали для ссылки на старый список.
Если на этот старый список ссылаются несколько имен (включая записи в контейнерах), эта повторная привязка не влияет ни на одно из них: например, если у вас есть функция, которая принимает mylist
в качестве аргумента, пустое имя назначение имеет какой-либо эффект только локально для функции и не изменяет то, что вызывающий видит как содержимое списка.
Присваивая срезу целого списка, mylist[:] = ...
, изменяет объект списка , а не перебирает переключение привязок голых имен - теперь этот список действительно изменен и, независимо от того, как на него ссылаются новое значение - это то, что видели. Например, если у вас есть функция, которая принимает mylist
в качестве аргумента, присвоение среза всего списка изменяет то, что вызывающий абонент видит как содержимое списка.
Ключевым моментом является точное знание того, какого эффекта вы добиваетесь - чаще всего вы захотите изменить объект списка, поэтому, если нужно угадать, назначение среза целого списка обычно является лучшим предположением; -). С точки зрения производительности, это не имеет никакого значения в любом случае (за исключением того, что назначение без имен, если оно хранит как старые, так и новые объекты списка, будет занимать больше памяти в течение любого промежутка времени, конечно, когда оба объекта все еще существуют).