Python: оператор Splat/unpack * в python не может использоваться в выражении?
Кто-нибудь знает аргументы относительно того, почему оператор унарного (*
) не может использоваться в выражении, включающем итераторы/списки/кортежи?
Почему это ограничивается функцией распаковки? или я ошибаюсь, думая об этом?
Например:
>>> [1,2,3, *[4,5,6]]
File "<stdin>", line 1
[1,2,3, *[4,5,6]]
^
SyntaxError: invalid syntax
Почему оператор *
не работает:
[1, 2, 3, *[4, 5, 6]] give [1, 2, 3, 4, 5, 6]
тогда, когда оператор *
используется с вызовом функции, он разворачивается:
f(*[4, 5, 6]) is equivalent to f(4, 5, 6)
Существует сходство между +
и *
при использовании списков, но не при расширении списка другим типом.
Например:
# This works
gen = (x for x in range(10))
def hello(*args):
print args
hello(*gen)
# but this does not work
[] + gen
TypeError: can only concatenate list (not "generator") to list
Ответы
Ответ 1
Невозможно распаковать в Python 2.x
отметить и зафиксировать в Python 3.5
, который теперь имеет эту функцию, как описано в PEP 448
Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) on Windows (64 bits).
>>> [1, 2, 3, *[4, 5, 6]]
[1, 2, 3, 4, 5, 6]
Вот несколько пояснений для обоснования этого изменения.
Ответ 2
Asterix *
- это не просто унарный оператор, он аргумент-распаковка оператора для определения функций и вызовы функций.
Итак, *
предполагается использовать только для работы с параметрами функции и не с списками, кортежами и т.д.
ПРИМЕЧАНИЕ., начиная с python3.5, *
можно использовать не только с параметрами функций, @B. M в значительной степени описывает это изменение в python.
Если вам нужно, чтобы в списках concat использовалось конкатенация вместо list1 + list2
, чтобы получить желаемый результат.
Чтобы объединить список и генератор, просто передайте объект generator
to list
type, предварительно конкатенируя с другим списком:
gen = (x for x in range(10))
[] + list(gen)
Ответ 3
Это не поддерживается. Python 3 дает лучшее сообщение (хотя Python 2 не поддерживает *
в левой части назначения, afaik):
Python 3.4.3+ (default, Oct 14 2015, 16:03:50)
>>> [1,2,3, *[4,5,6]]
File "<stdin>", line 1
SyntaxError: can use starred expression only as assignment target
>>>
f(*[4,5,6])
эквивалентно f(4,5,6)
Развертывание аргумента функции - это особый случай.