Используя PyCharm, я заметил, что он предлагает преобразовать dict литерал :
d = {
'one': '1',
'two': '2',
}
в конструктор dict :
d = dict(one='1', two='2')
Различаются ли эти разные подходы каким-либо существенным образом?
(При написании этого вопроса я заметил, что с помощью dict()
него невозможно указать числовой ключ ... d = {1: 'one', 2: 'two'}
возможно, но, очевидно, dict(1='one' ...)
нет. Что-нибудь еще?)
python
dictionary
pycharm
maligree
источник
источник
dict()
принимает список пар ключ-значение, а также разрешает именованные параметры, поэтому он может использовать для создания любого типа dict, только не с синтаксисом, который вы используете. Также, вероятно, ничего не стоит, что в pyCharm была ошибка ( youtrack.jetbrains.net/issue/PY-2512 ) именно из-за того, что вы обнаружили, и она была исправлена).dict(abc = 123)
конструктор создает словарь с ключами байтовой строки'abc'
, что может быть удивительно, если вы используетеunicode_literals
и ожидаете, что ключи словаря будут в юникодеu'abc'
. См. Stackoverflow.com/questions/20357210/… .Ответы:
Я думаю, что вы указали на наиболее очевидную разницу. Помимо этого,
первое не нуждается в поиске,
dict
что должно сделать его чуть-чуть быстреевторой смотрит
dict
в ,locals()
а затемglobals()
и находит встроенные, так что вы можете переключить поведение, определяя местный называетсяdict
, например , хотя я не могу думать о любом месте это было бы хорошей идеей , кроме , возможно , при отладкеисточник
Literal намного быстрее, так как он использует оптимизированные коды операций BUILD_MAP и STORE_MAP, а не универсальный CALL_FUNCTION:
источник
Они выглядят почти одинаково на Python 3.2.
Как указал gnibbler, первый не нуждается в поиске
dict
, что должно сделать его чуть-чуть быстрее.источник
$ pypy -m perf timeit -l '1000000' -n '5' -s 'i=(("a",1), ("b", 2), ("c", 3))' "{'a': 1, 'b': 2, 'c': 3}" ....... Mean +- std dev: 1.73 ns +- 0.14 ns $ pypy -m perf timeit -l '1000000' -n '5' -s 'i=(("a",1), ("b", 2), ("c", 3))' '{k:v for k,v in i}' ....... Mean +- std dev: 139 ns +- 10 ns $ pypy -m perf timeit -l '1000000' -n '5' -s 'i=(("a",1), ("b", 2), ("c", 3))' 'dict(i)' ....... Mean +- std dev: 188 ns +- 16 ns
Эти два подхода создают идентичные словари, за исключением, как вы заметили, где лексические правила Python мешают.
Словарные литералы являются немного более очевидными словарями, и вы можете создать любой вид ключа, но вам нужно заключить в кавычки имена ключей. С другой стороны, вы можете использовать переменные для ключей, если вам нужно по какой-то причине:
dict()
Конструктор дает большую гибкость из - за многообразия форм ввода он принимает. Например, вы можете предоставить ему итератор пар, и он будет обрабатывать их как пары ключ / значение.Я понятия не имею, почему PyCharm предложил бы преобразовать одну форму в другую.
источник
Одна большая разница с python 3.4 + pycharm заключается в том, что конструктор dict () выдает сообщение «синтаксическая ошибка», если количество ключей превышает 256.
Я предпочитаю использовать dict literal сейчас.
источник
Из Python 2.7 учебник:
Пока:
Таким образом, и {}, и dict () создают словарь, но предоставляют немного разные способы инициализации словарных данных.
источник
Я нахожу, что литерал dict
d = {'one': '1'}
гораздо более удобен для чтения, определяя данные, а не присваивая значения вещей и отправляя ихdict()
конструктору.С другой стороны, я видел, как люди неправильно набирают буквальный
d = {'one', '1'}
неправильно набирают который в современном python 2.7+ создаст набор.Несмотря на это, я все еще предпочитаю использовать множественные литералы, потому что я думаю, что это более читабельное личное предпочтение, я полагаю.
источник
set
s существует. Хотелось бы, чтобы для упорядоченных диктов был буквальный синтаксис ... уверен, что я использую их чаще, чем наборыЛитерал dict () удобен, когда вы копируете вставленные значения из чего-то другого (без python). Например, из списка переменных окружения. если у вас есть файл Bash, скажем
Вы можете легко вставить затем в
dict()
литерал и добавлять комментарии. Это также упрощает обратное, копирование в другое. Принимая во внимание, что{'FOO': 'bar'}
синтаксис довольно уникален для Python и JSON. Так что если вы часто используете json, вы можете использовать{}
литералы с двойными кавычками.источник
Не существует dict-литерала для создания классов, унаследованных от dict, пользовательских классов dict с дополнительными методами. В таком случае должен использоваться пользовательский конструктор класса dict, например:
источник
Также учтите тот факт, что токены, которые соответствуют операторам, не могут использоваться в синтаксисе конструктора, то есть в деширированных ключах.
источник