Подтвердить что ты не робот

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
4b9b3361

Ответ 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)

Развертывание аргумента функции - это особый случай.