Первое общее правило: не изменяйте контейнеры: создавайте новые.
Не изменяйте входящий словарь, создайте новый словарь сподмножество ключей.
self.fields = dict( key, value for key, value in fields.items()
if accept_key(key, data) )
Такие методы обычно немного более эффективны, чем прохождение и удаление плохих элементов в любом случае.В более общем смысле, зачастую проще избежать изменения объектов и создать новые.
Второе общее правило: не изменяйте контейнеры после их передачи.
Обычно вы не можете предполагать, что контейнеры, в которые вы передали данные, сделали свои собственные копии.В результате не пытайтесь модифицировать контейнеры, которые вы им дали.Любые изменения должны быть сделаны до передачи данных.Как только вы передали контейнер кому-то другому, вы больше не являетесь его единственным хозяином.
Третье общее правило: не изменяйте контейнеры, которые вы не создавали.
Если вы прошли какой-то контейнер, вы не знаете, кто еще может использовать этот контейнер.Так что не изменяйте это.Либо используйте неизмененную версию, либо вызовите правило 1, создав новый контейнер с нужными изменениями.
Четвертое общее правило: (украдено у Итана Фурмана)
Некоторые функции должен изменить список.Это их работа.Если дело обстоит именно так , укажите это в имени функции (например, методы списка добавляются и расширяются).
Собираем все вместе:
Часть кода должна изменять контейнер только тогда, когда он является единственным фрагментом кода, имеющим доступ к этому контейнеру.