2010-04-30 5 views

ответ

22

d=dict() требует поиск в locals() затем globals() затем __builtins__, d={} не

+0

Нет, 'dict' находится в' __builtin__'. –

+0

@MikeGraham да, но в большинстве случаев '__builtins__' является псевдонимом для' __builtin__' – jamylak

9

Если люди используют (только) dict() над (только) {}, это вообще, потому что они не знают о {} (что вполне подвиг), или потому, что они думают, что это понятнее (который носит субъективный характер, но редко.)

есть вещи, которые вы можете сделать с dict, что вы не можете сделать с {}, хотя, например, передать его на что-то, что ожидает калла как, например, collections.defaultdict(dict). Там также тот факт, что вы можете вызвать dict с именованными аргументами, которые некоторые люди предпочитают:

>>> dict(spam=1, ham=2) 
{'ham': 2, 'spam': 1} 

Лично я предпочитаю синтаксис литерала Dict, потому что он работает лучше, когда вы хотите использовать ключи, которые не являются допустимыми идентификаторами:

>>> dict(pass=1) 
File "<stdin>", line 1 
    dict(pass=1) 
     ^
SyntaxError: invalid syntax 
>>> dict('ham and eggs'=1) 
    File "<stdin>", line 1 
SyntaxError: keyword can't be an expression 

(и смешение стилей только потому, что некоторые клавиши не являются допустимыми идентификаторами, гадости.)

42

Я один из тех, кто предпочитает слова пунктуации - это одна из причин, почему я выбрал Python над Perl, например. «Жизнь лучше без брекетов» (старый девиз Python, который по-прежнему шел на футболке с мультфильмом улыбающегося подростка ;-) (изначально предназначался для обозначения скобок и отступов для группировки, конечно, но, эй , скобки - скобки! -).

«Оплачивать» несколько наносекунд (с целью использования четкого, легко читаемого короткого слова вместо брекетов, скобок и других элементов), как правило, является доступным (это в основном стоимость поиска в пространстве имен «встроенные», цена, которую вы платить каждый раз, когда вы используете встроенный тип или функцию, и вы можете мягко оптимизировать его обратно, подняв некоторые поиски из циклов).

Итак, я вообще тот, кто любит писать dict() для {}, list(L) вместо L[:], а также list() для [], tuple() для (), и так далее - просто общее предпочтение стиль произносимых код. Когда я работаю над существующей базой кода, которая использует другой стиль, или когда у моих товарищей по команде в новом проекте есть сильные предпочтения, я могу согласиться с этим, конечно (не без попытки немного евангелизации в случае товарищей по команде, хотя ;-).

+0

«поднимая некоторые поиски из циклов» - что это значит? – Tshepang

+9

@Tshepang, т.е. вместо 'for i в x: f (dict())' (что делает 'len (x)' lookups для name 'dict'), сначала связывает локальный' d = dict' вне цикла, а затем 'for i in x: f (d()) ', который выполняет быстрый поиск _local для имени' d').Это фундаментальный метод Python для оптимизации некоторых циклов, когда они доказаны (путем профилирования, конечно), чтобы быть узкими местами производительности. –

+1

Кстати (конечно, не связанный с этим вопросом), Unladen Swallow должен сделать ненужным такую ​​идиому (d = dict) :) – rbp

1

Как сказал Томас, я использую dict(), поэтому могу указать ключевые слова. Особенно, если я вручную создаю большой словарь для инициализации данных или еще чего-то: возможность использования синтаксиса ключевых слов сохраняет мне два нажатия клавиш (и связанный визуальный беспорядок) для каждого элемента.

Смежные вопросы