파이썬에서“(1,) == 1,”의 의미는 무엇입니까?


119

튜플 구조를 테스트하고 있는데 ==다음과 같은 연산자를 사용할 때 이상하다는 것을 알았습니다 .

>>>  (1,) == 1,
Out: (False,)

이 두 표현식을 변수에 할당하면 결과는 참입니다.

>>> a = (1,)
>>> b = 1,
>>> a==b
Out: True

이 질문은 내 관점 에서 Python 튜플 후행 쉼표 구문 규칙 과 다릅니다 . 나는 ==연산자 사이의 표현 그룹을 묻습니다 .


16
2 시간 전 OP 의 이전 질문 을 보면 , 질문을 다르게 구성하는 것만으로도 다른 결과 (및 커뮤니티의 수용)로 이어질 수 있다는 것이 놀랍거나 이상해 보입니다.
AKS

24
@AKS 이것들은 다른 qestions입니다
kmaork

7
@AKS 여기서 질문은 약간 다르지만 귀하의 요점에 완전히 동의합니다. 무리 효과 일명 HNQ.
Insane

5
@PythonNewHand 사실, 그것은 완전히 수용 가능합니다. 그것이 내가 질문을 다르게 구성하는 이유 입니다.
AKS

3
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 어떻게 알아? 나는 그 대답을 훑어 보았고이 특정한 상황을 다루는 것 같지 않은 것을 보았다.
Dan Getz

답변:


88

다른 답변은 여기에 설명 된대로 동작이 연산자 우선 순위 때문이라는 것을 이미 보여주었습니다 .

다음에 이와 비슷한 질문이있을 때 직접 답을 찾는 방법을 보여 드리겠습니다. 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
또 다른 유용한 도구는 dis-이 경우 LOAD_CONST서로 다른 값 ( (1,)1)과 BUILD_TUPLEopp 코드를 가진 두 개가 표시 됩니다 .
mgilson

153

이것은 단지 연산자 우선 순위입니다. 너의 첫번째

(1,) == 1,

다음과 같은 그룹 :

((1,) == 1),

따라서 단일 요소 튜플 1,을 정수 1와 동등성을 위해 비교 한 결과에서 단일 요소로 튜플을 만듭니다. 그들은 같지 않으므로 False,결과에 대해 1- 튜플 을 얻습니다 .


61
실제로는 아니지만 1- 튜플에는 이상한 구문이 있습니다. 일반적으로, 예를 들어 로 그룹화 1+2, 2==3, 4*7하지 않으면 훨씬 더 놀랄 것 (1+2), (2==3), (4*7)입니다. 실제로 1- 튜플은 거의 사용되지 않습니다 (StackOverflow 질문 외부에서는 ;-)).
Tim Peters

6
아마도 "예기치 않은"이 "이상한"단어보다 더 나은 단어 였을 것입니다. 나는 당신의 관점과 초점에 따라 두 가지가 될 수있는 그림 중 하나를 보는 것 같은 느낌이 듭니다 . 같음 연산자는 쉼표에 비해 너무 커서 집중하기 쉽고 결과가 True/ 일 것이라고 가정하기 쉽습니다 False. 이제 무슨 일이 일어나고 있는지 이해 했으므로 완벽하고 합리적입니다.
skrrgwasme

31
이제 "Zen of Python"이 무엇을 의미하는지 알 수 있습니다. "Zen of Python"을 수행하는 한 가지 분명한 방법은 "네덜란드 사람이 아니면 처음에는 분명하지 않을 수 있습니다.";-)
Tim Peters

7
문서를 읽고 튜플을 만드는 것이 괄호가 아니라 쉼표라는 것을 보면 약간 혼란 스럽습니다! 따라서이 문장에서 오른손의 쉼표는 테스트의 일부로 간주되지 않지만 구분자로 간주됩니다! 예상치 못한 동작!
Ikra_5

3
표현식에 대한 일반적인 조언은 "의심스러운 경우 괄호를 사용하십시오"입니다. 그 다음에는 튜플 구문의 일부가 아니더라도 모든 1- 튜플을 괄호로 묶는 것이 좋습니다.
nigel222

12

당신이 할 때

>>> (1,) == 1,

튜플 (1,)정수 와 비교 한 결과로 튜플을 빌드하여 False.

대신 변수에 할당 할 때 두 개의 동일한 튜플 이 서로 비교됩니다.

당신은 시도 할 수 있습니다:

>>> x = 1,
>>> x
(1,)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.