В Python, что определяет порядок при итерации через kwargs?

В python я написал эту функцию, чтобы научить себя, как **kwargs работает в Python:

 def fxn(a1, **kwargs): print a1 for k in kwargs: print k, " : ", kwargs[k] 

Затем я назвал эту функцию

  • Оцениваются ли функции при передаче в качестве параметров?
  • Принудительное именование параметров в Python
  • Что означает только звезда * в объявлении функции?
  • Должен ли я добавить конечную запятую после последнего аргумента в вызове функции?
  • Python: как передать аргументы функции __code__ функции?
  • Передача аргументов C # vs Python
  •  fxn(3, a2=2, a3=3, a4=4) 

    Вот результат, который напечатал мой интерпретатор Python:

     3 a3 : 3 a2 : 2 a4 : 4 

    Почему цикл for печатал значение a3 перед тем, что было в a2, хотя я сначала подал a2 в свою функцию?

  • Что означает только звезда * в объявлении функции?
  • Должен ли я добавить конечную запятую после последнего аргумента в вызове функции?
  • Python: как передать аргументы функции __code__ функции?
  • Принудительное именование параметров в Python
  • Передача аргументов C # vs Python
  • Оцениваются ли функции при передаче в качестве параметров?
  • 6 Solutions collect form web for “В Python, что определяет порядок при итерации через kwargs?”

    kwargs – это словарь. Словари неупорядочены – просто поставлены, порядок не определен и деталь реализации. Подглядывание под капотом покажет, что порядок сильно варьируется в зависимости от хеш-значений элементов, порядка вставки и т. Д., Поэтому вам лучше не полагаться на что-либо, связанное с ним.

    Это словарь. И, как упоминалось в документации, словарь не имеет порядка (из http://docs.python.org/tutorial/datastructures.html#dictionaries ):

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

    Но вы можете сделать его обработанным в некотором порядке , например:

    • используя sorted() :

       def fxn(a1, **kwargs): print a1 for k in sorted(kwargs): # notice "kwargs" replaced by "sorted(kwargs)" print k, " : ", kwargs[k] 
    • или с помощью типа OrderedDict (вы можете передать объект OrderedDict качестве параметра, содержащего все пары ключ-значение):

       from collections import OrderedDict def fxn(a1, ordkwargs): print a1 for k in ordkwargs: print k, " : ", ordkwargs[k] fxn(3, OrderedDict((('a2',2), ('a3',3), ('a4',4)))) 

    Прискорбная ирония заключается в том, что определение ** kwargs означает, что следующее не будет работать (по крайней мере, не так, как можно было бы ожидать):

     od = OrderedDict(a=1, b=2, c=3) 

    Поскольку аргументы с ключевыми словами сначала встроены в неупорядоченный dict, вы не можете зависеть от того, что они будут вставлены в OrderedDict в том порядке, в котором они перечислены. 🙁

    Это, наконец, было введено в выпуске 3.6 . **kwargs теперь является OrderedDict , поэтому порядок аргументов ключевого слова сохраняется.

     Python 3.6.0 (default, Jan 13 2017, 13:27:48) >>> def print_args(**kwargs): ... print(kwargs.keys()) ... >>> print_args(first=1, second=2, third=3) dict_keys(['first', 'second', 'third']) 

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

    Фактически, как исправление недавней проблемы безопасности на многих языках программирования, в будущем порядок может даже измениться между вызовами вашей программы (вызовы интерпретатора Python).

    kwargs – это словарь, в Python они не упорядочены, поэтому результат по существу (псевдо) случайный.

    Python - лучший язык программирования в мире.