Аргументы ключевого слова упаковки Python с *

У меня есть код, который я изучаю, и я полностью здесь застрял.

код:

def f(*a):
    print a
print (*[1,2]) # prints (1,2)

ПОЧЕМУ? Я не знаю, что за этим стоит. Я знаю, что *args преобразует аргументы переменной длины в кортежи, но что это (*[1,2]) выполняет?


person user3467433    schedule 27.03.2014    source источник
comment
Вам не хватает вызова функции в последней строке? Ваш код не будет работать как есть.   -  person Blender    schedule 27.03.2014


Ответы (2)


Думаю, вы вместо этого хотели написать следующее:

print f(*[ 1, 2]) # Python 2
print(f(*[ 1, 2])) # Python 3

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

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

Вы можете назвать это как

f(*[1, 2])  # with unpacking

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

f(1, 2)
person Christian    schedule 27.03.2014
comment
а не разархивирование происходит только при вызове zip (* Stuff)? Сам * также выполняет это? Или распаковка отличается от распаковки? - person user3467433; 27.03.2014
comment
Абсолютно другой. Просто поиграйте с ним, и вы поймете, почему. Обратите внимание, что когда вы делаете zip(*stuff), вы сначала распаковываете и архивируете. Каждый процесс индивидуален. - person Christian; 27.03.2014

Это называется распаковкой аргументов - см. Ссылку в документации.

Короче говоря, print f(*[1,2]) принимает каждый элемент списка и передает его как отдельный аргумент методу f.

Метод f принимает несколько позиционных аргументов, которым в теле присваивается имя a.

Итак, когда вы набираете f(*[1,2]), это то же самое, что и f(1,2). С другой стороны, f получает 1,2 как кортеж a и печатает его:

>>> def f(*a):
...    print(a)
...
>>> f(*[1,2])
(1, 2)
person Burhan Khalid    schedule 27.03.2014