2015-07-08 4 views
0

У меня есть функция, определенная как таковая:передачи аргументов при использовании * арг

def foo(arg1, *args): 
    print type(args), args 

Может кто-то объяснить разницу между вызовом foo пропусканием expectedResults в следующих 2-мя способами:

expectedResults = ['RESULT1', 'RESULT2'] 
foo(res, expectedResults) 

печать следующие

<type 'tuple'> (['RESULT1', 'RESULT2'],) 

Пройдя expectedResults Поля, как такой

foo(res, *expectedResults) 

Я получаю это

<type 'tuple'> ('RESULT1', 'RESULT2') 

Мой вопрос: Почему изменение поведения между передачей expectedResults без звездочки предваряется по сравнению с?

ответ

3

*expectedResults распаковывает список перед отправкой содержимого.
Это как сказать foo(res, 'RESULT1', 'RESULT2'), тогда как foo(res, expectedResults) просто передал сам список как 1 аргумент, в результате получился кортеж с 1 элементом.

Так

foo(res, *expectedResults) 

эквивалентно

foo(res, 'RESULT1', 'RESULT2') 

положить обе строки в * параметра арг и

foo(res, expectedResults) 

эквивалентно

foo(res, ['RESULT1', 'RESULT2']) 

размещение только списка в параметре * args.

+0

спасибо. Это прояснилось. – ILostMySpoon

1

Если у вас есть * args, метод автоматически создаст список из аргументов, поэтому, даже если вы передадите ему список, он просто вставляет весь список в кепп (так что у вас есть один элемент в args, список ожидаемых результатов). Когда вы используете asterix для передачи аргументов, вы вместо этого передаете то, что находится в списке.

так что foo (res, expectedResults) совпадает с передачей res, ['RESULT1', 'RESULT2'] (и вы можете отправить несколько списков), а foo (res, * expectedResults) - это то же самое, что и foo (res, 'RESULT1', 'RESULT2').

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