튜플 구조를 테스트하고 있는데 ==
다음과 같은 연산자를 사용할 때 이상하다는 것을 알았습니다 .
>>> (1,) == 1,
Out: (False,)
이 두 표현식을 변수에 할당하면 결과는 참입니다.
>>> a = (1,)
>>> b = 1,
>>> a==b
Out: True
이 질문은 내 관점 에서 Python 튜플 후행 쉼표 구문 규칙 과 다릅니다 . 나는 ==
연산자 사이의 표현 그룹을 묻습니다 .
답변
다른 답변은 여기에 설명 된대로 동작이 연산자 우선 순위 때문이라는 것을 이미 보여주었습니다 .
다음에 이와 비슷한 질문이있을 때 직접 답을 찾는 방법을 보여 드리겠습니다. ast
모듈을 사용하여 표현식이 구문 분석하는 방법을 분해 할 수 있습니다 .
>>> import ast
>>> source_code = '(1,) == 1,'
>>> print(ast.dump(ast.parse(source_code), annotate_fields=False))
Module([Expr(Tuple([Compare(Tuple([Num(1)], Load()), [Eq()], [Num(1)])], Load()))])
이것으로부터 우리는 Tim Peters가 설명했던 것처럼 코드가 파싱 되는 것을 볼 수 있습니다 .
Module([Expr(
Tuple([
Compare(
Tuple([Num(1)], Load()),
[Eq()],
[Num(1)]
)
], Load())
)])
답변
이것은 단지 연산자 우선 순위입니다. 너의 첫번째
(1,) == 1,
다음과 같은 그룹 :
((1,) == 1),
따라서 단일 요소 튜플 1,
을 정수 1
와 동등성을 위해 비교 한 결과에서 단일 요소로 튜플을 만듭니다. 그들은 같지 않으므로 False,
결과에 대해 1- 튜플 을 얻습니다 .
답변
당신이 할 때
>>> (1,) == 1,
튜플 (1,)
을 정수 와 비교 한 결과로 튜플을 빌드하여 False
.
대신 변수에 할당 할 때 두 개의 동일한 튜플 이 서로 비교됩니다.
당신은 시도 할 수 있습니다:
>>> x = 1,
>>> x
(1,)