2016-12-11 4 views
0

Я нашел это правило here, я просто не понял, как "*" or_expr эквивалентен starred_item. Если нет ничего плохого, в чем проблема, вызвавшая мой код a = 8;b = 2; *(a >> b), = (1,2,3), чтобы создать исключение, в котором говорилось: «SyntaxError: can» t назначить оператору "?Могут ли все небольшие правила EBNF в Python быть составлены в более правильном?

+1

Что бы вы даже хотели, чтобы произойти с этим утверждением? – jsbueno

+0

Этот код не имеет смысла, поэтому совершенно понятно, что он вызывает «SyntaxError». OTOH, '* a, = 1, 2, 3' (в последних версиях Python). –

+0

Я изучаю синтаксис выражения Python. Я получил правило '* (идентификатор« >> »идентификатор) из определенных правил, которые классифицируются как« starred_expression ». Кортеж или список могут появляться в левой части простое присваивание, поэтому может '* (идентификатор« >> »идентификатор),'. но я не получил правильный результат. –

ответ

1

атрибуция в 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) 
+0

Я знал этот вывод, который был представлен [PEP-3132] (https://www.python.org/dev/peps/pep-3132/). –

+0

Я нахожу правило EBNF [присваивания] (https://docs.python.org/3.5/reference/simple_stmts.html#assignment-statements), что объясняет мою ситуацию и подтверждает ваш ответ. –