2015-10-26 1 views
5

Примечание: Это не дубликат из linked answer, что основное внимание уделяется вопросам, связанным с исполнением, а также то, что происходит за кулисами, когда вызов функции ДИКТ() производится. Мой вопрос состоит в том, что аргументы ключевых слов всегда приводят к ключам типа string. Определенно не дубликат.Will dict (** kwargs) всегда дает словарь, где Keys имеют строку типа?


Метод-1:

suit_values = {'spades':3, 'hearts':2, 'diamonds':1, 'clubs':0} 

Метод-2:

suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0) 

Метод-1 имеет смысл для меня. Это как сказать python, чтобы дать мне словарь, где клавиши являются строками и значениями являются численные. Но в методе-2, как питон знает, что ключи - это строки, а не что-то еще?

Это тренд? если да, то некоторые другие примеры (кроме словарей), которые показывают это своеобразное поведение?

EDIT-1:

Мое понимание из ответов:

  1. Метод-2 является dict(**kwargs) способ создания словаря.
  2. В spades=3, spades является допустимым идентификатором Python, поэтому берется как ключ типа string.

Таким образом, будет dict(**kwargs)всегда результат в словаре, где ключи типа string?

EDIT-2: ^^ ДА.

ответ

4

Во втором случае функция dict принимает аргументы ключевых слов. И аргументы ключевого слова могут передаваться только как строковые параметры.

Цитируя documentation,

Предоставление аргументы ключевых слов, как в первом примере, работает только для ключей, которые являются допустимыми идентификаторами Python. В противном случае могут использоваться любые допустимые ключи.

Пока строка является допустимым идентификатором python, вы можете использовать ее как ключ во второй форме.Например, следующий не будет работать со второй формой

>>> dict(1=2) 
    File "<input>", line 1 
SyntaxError: keyword can't be an expression 

Но то же самое будет работать с первой формой

>>> {1:2} 
{1: 2} 
+0

Я действительно не получил «И аргументы ключевого слова могут передаваться только с параметрами». – Somjit

+0

@Somjit Хммм, я немного отредактировал. Надеюсь, теперь это ясно. – thefourtheye

+0

Хорошо. В этом есть смысл. Таким образом, аргументы ключевого слова могут передаваться только как строки. Но после того, как они пройдены, они также «поглощаются» как строки, т. Е. Хранятся как объекты типа строки? Мое редактирование задает этот вопрос в конце. – Somjit

2

Метод 1, буквальное выражение словаря, можно использовать в качестве ключей любой hashable значения , как строки, целые числа или tuple s.

Способ 2 - встроенная функция dict() - не знает, что клавиши являются строками. Независимо от того, какие ключи, которые вы используете с этим методом, должны следовать традиционным соглашениям об именах переменных, которые должны быть преобразованы в строки. Это означает, что каждый ключ должен начинаться с буквы или подчеркивания, содержать только буквы, символы подчеркивания или числа и т. Д. Попробуйте другой ключ, например 2a или (1,2), не получится.

+0

Не могли бы вы снова открыть сообщение. Это не то же самое, что и вопрос, который вы отметили как дублирующийся. – Somjit