2015-04-15 2 views
0

У меня есть функция:Как объяснить поведение обработки функций?

def test_func(a, b): 
    print a 
    print b 

Я знаю, что это не правильно использовать словарь при вызове функции выглядит следующим образом:

a = {1:2, 3:4} 
test_func(*a) # function expects a sequence as an argument 

Это должно быть turple или список вместо этого. Но консоль не отображает ошибок и не печатает ключи этого словаря: 1 и 3.

Похож на это: когда вызов функции ожидает последовательность, но принимает словарь, он вытаскивает словарные ключи в качестве последовательности аргументов. Это нормально?

+1

«Все в порядке?» - Да, ваше наблюдение правильное, и все в порядке. – thefourtheye

+1

Да, это так. Вы также можете использовать 'для ключа в D'. – wvdz

+1

, чтобы распаковать словарь в качестве имени, который вы используете '**'. – will

ответ

2

a a sequence. Более конкретно, при повторении dict итерация дает ключи словаря (в непредсказуемом порядке).

Рассмотрим

for i in {1:2, 3:4}: 
    print i 

Результат будет печатать 1 и 3, так как итерация dict дает ключи.

Как в стороне, есть также интересный способ использования словарей для передачи аргументов:

a = {'a':2, 'b':4} 
test_func(**a) 

Двойной звездочка передает значения dict с подобными названиями параметров функции. В этом случае функция печатает 2 и 4 в указанном порядке.

+0

Результат * может * быть 1 и 3; он может также быть 3 и 1. – chepner

+0

Верно, что порядок вывода первого фрагмента неопределен. –

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