Я нашел это правило here, я просто не понял, как "*" or_expr
эквивалентен starred_item
. Если нет ничего плохого, в чем проблема, вызвавшая мой код a = 8;b = 2; *(a >> b), = (1,2,3)
, чтобы создать исключение, в котором говорилось: «SyntaxError: can» t назначить оператору "?Могут ли все небольшие правила EBNF в Python быть составлены в более правильном?
ответ
атрибуция в Python - что происходит с оператором присваивания =
или одного из увеличенных операторов (+=
, -=
, ...) на самом деле является утверждение, и не может быть использована как часть нормального выражения, как в C -syntax.
Левая часть задания должна иметь смысл как имя переменной (или последовательность имен).
Выражение, которое вы пытаетесь использовать там *a >> b, = (1,2,3)
(к которому я допускаю, что не могу понять, чего вы хотели достичь) эквивалентно последовательности, был первый (и только) элемент: *a >> b
- это недействительно имя в Python - поэтому ваша ошибка.
«* а» в assignemnts означает, что любая длина, что «осталось» после присвоения к другим частям последовательности имен присваиваются помеченное имя:
In [3]: *a, b = (1, 2, 3)
In [4]: a
Out[4]: [1, 2]
In [5]: b
Out[5]: 3
И это детерминированный и работает всякий раз, когда появляется *:
In [6]: a, b, *c, d = range(10)
In [7]: [a, b, c, d]
Out[7]: [0, 1, [2, 3, 4, 5, 6, 7, 8], 9]
И, конечно, если кто-то пытается использовать две звезды, что приводит к ошибке из-за неопределенности:
In [8]: *a, *b, c = range(5)
File "<ipython-input-8-e75ad61b842a>", line 1
*a, *b, c = range(5)
^
SyntaxError: two starred expressions in assignment
Снова обратите внимание, что в левой части оператора атрибуции никоим образом не допускается произвольное выражение.
В выражениях non-assignemnt оператор * можно использовать для расширения на месте итерации. До Python 3.5 это было возможно только при вызовах функций - теперь возможно, что в любом месте была последовательность литералов:
In [9]: a = 0, *range(10, 12), 2
In [10]: a
Out[10]: (0, 10, 11, 2)
Я знал этот вывод, который был представлен [PEP-3132] (https://www.python.org/dev/peps/pep-3132/). –
Я нахожу правило EBNF [присваивания] (https://docs.python.org/3.5/reference/simple_stmts.html#assignment-statements), что объясняет мою ситуацию и подтверждает ваш ответ. –
Что бы вы даже хотели, чтобы произойти с этим утверждением? – jsbueno
Этот код не имеет смысла, поэтому совершенно понятно, что он вызывает «SyntaxError». OTOH, '* a, = 1, 2, 3' (в последних версиях Python). –
Я изучаю синтаксис выражения Python. Я получил правило '* (идентификатор« >> »идентификатор) из определенных правил, которые классифицируются как« starred_expression ». Кортеж или список могут появляться в левой части простое присваивание, поэтому может '* (идентификатор« >> »идентификатор),'. но я не получил правильный результат. –