이 규칙이 here 인 것을 발견했습니다. 이 starred_item
과 어떻게 동등한 지 알지 못했습니다. 아무런 문제가없는 경우, 내 코드 a = 8;b = 2; *(a >> b), = (1,2,3)
이 "SyntaxError : can ' t 연산자에 할당? " 파이썬에서파이썬의 모든 작은 EBNF 규칙을 더 큰 올바른 규칙으로 구성 할 수 있습니까?
답변
귀인 이론 - 할당 연산자 =
또는 증강 연산자 중 하나 (+=
, -=
, ...)로 발생 실제로 문이며, C에서와 같이 정상적인 표현의 일부로 사용할 수 없습니다 -syntax 파생 된 언어.
과제의 왼쪽 부분은 변수 이름 (또는 일련의 이름)으로 이해해야합니다.
사용하려는 표현이 *a >> b, = (1,2,3)
(달성하고자하는 것을 이해할 수 없다는 것을 인정합니다)은 시퀀스와 같습니다. 첫 번째 요소는 *a >> b
입니다. 파이썬에서 이름 - 따라서 오류.
은 "*는"assignemnts는 이름의 순서의 다른 부분에 속성 후 "의 왼쪽"고 어떤 아이폰에이 별표 이름에 할당되는 것을 의미에서 :
In [3]: *a, b = (1, 2, 3)
In [4]: a
Out[4]: [1, 2]
In [5]: b
Out[5]: 3
그리고 그 결정과 A *가 나타납니다 작품마다 :
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]
그리고 물론
, 하나, 별 2 개를 사용하려고하면 때문에 모호함에 오류가 발생합니다 :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
다시 말하지만, 속성 연산자의 왼쪽에는 임의의 표현식이 허용되지 않습니다.
할당되지 않은 식에서 * 연산자를 사용하여 반복 가능한 iterable을 확장 할 수 있습니다. 기능에서만 가능했던 파이썬 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/)에 의해 소개 된이 결론을 알았습니다. –
[할당 문구] (https://docs.python.org/3.5/reference/simple_stmts.html#assignment-statements)의 EBNF 규칙을 찾았습니다.이 규칙은 제 상황을 설명하고 답변을 확인했습니다. –
당신도이 문을 어떻게 할 것인가? – jsbueno
그 코드는 의미가 없으므로 'SyntaxError'가 발생한다는 것은 완전히 이해할 수 있습니다. OTOH,'* a, = 1, 2, 3'은 유효합니다 (최신 버전의 Python에서). –
파이썬 표현의 구문을 연구 중이다. 나는'starred_expression'으로 분류 된 특정 규칙으로부터''(identifier ">>"identifier ") 규칙을 도출했다. 터플이나리스트는 왼쪽에 나타날 수있다. 간단한 할당이므로'* (identifier ">>"identifier ")가 될 수 있습니다. 그러나 올바른 결과를 얻지 못했습니다. –