В python есть ли разница между вызовом clear()
и назначением {}
словаря? Если да, что это? Пример:
d = {"stuff":"things"}
d.clear() #this way
d = {} #vs this way
python
dictionary
Marcin
источник
источник
Ответы:
Если у вас есть другая переменная, также ссылающаяся на тот же словарь, есть большая разница:
Это связано с тем, что назначение
d = {}
создает новый пустой словарь и присваивает егоd
переменной. Это оставляетd2
указание на старый словарь с предметами, все еще в нем. Однако,d.clear()
очищает и тот же словарь , чтоd
иd2
как точку.источник
d = {}
создаст новый экземпляр для,d
но все другие ссылки будут по-прежнему указывать на старое содержимое.d.clear()
сбросит содержимое, но все ссылки на один и тот же экземпляр все равно будут правильными.источник
В дополнение к различиям, упомянутым в других ответах, есть также разница в скорости. d = {} более чем в два раза быстрее:
источник
d = {}
должна быть более быстрой, поскольку очистка целого может быть оставлена для сборщика мусора на потом.В качестве иллюстрации для вещей, уже упомянутых ранее:
источник
.clear
изменяет объект, но `= {}` создает новый объект.В дополнение к ответу @odano, кажется, использовать
d.clear()
быстрее, если вы хотели бы очистить голос много раз.Результат:
источник
Методы мутации всегда полезны, если исходный объект не находится в области видимости:
Повторное назначение словаря создаст новый объект и не изменит исходный.
источник
Одна вещь, не упомянутая, является вопросами определения объема. Не очень хороший пример, но вот случай, когда я столкнулся с проблемой:
Решение состоит в том, чтобы заменить
c_kwargs = {}
сc_kwargs.clear()
Если кто-то придумает более практичный пример, не стесняйтесь редактировать этот пост.
источник
global c_kwargs
вероятно, тоже будет работать нет? Хотя, вероятноglobal
, не самая лучшая вещь для использования.global
приведет к тому, что функция будет вести себя по-разному - все вызовы conf_decorator будут совместно использовать одну и ту же переменную c_kwargs. Я считаю, что Python 3 добавилnonlocal
ключевое слово для решения этой проблемы, и это будет работать.Кроме того, иногда экземпляр dict может быть подклассом dict (
defaultdict
например). В этом случае использованиеclear
является предпочтительным, поскольку нам не нужно запоминать точный тип dict, а также избегать дублирования кода (связывание строки очистки с линией инициализации).источник