source

파이썬에서 "0, 0 == (0, 0)"이 "(0, False)"와 같은 이유는 무엇입니까?

manysource 2023. 9. 27. 18:02

파이썬에서 "0, 0 == (0, 0)"이 "(0, False)"와 같은 이유는 무엇입니까?

Python에서 (Python 3.6으로만 확인했지만 이전 버전의 많은 경우에도 유지되어야 한다고 생각합니다):

(0, 0) == 0, 0   # results in a two element tuple: (False, 0)
0, 0 == (0, 0)   # results in a two element tuple: (0, False)
(0, 0) == (0, 0) # results in a boolean True

그러나:

a = 0, 0
b = (0, 0)
a == b # results in a boolean True

두 접근법 간에 결과가 다른 이유는 무엇입니까?이퀄리티 연산자는 튜플을 다르게 취급합니까?

처음 두 식은 모두 튜플로 파싱합니다.

  1. (0, 0) == 0,False에 ), 0
  2. 0에 , 0 == (0, 0) 은)False저쪽으로).).

수식은 등호 연산자와 비교하여 쉼표 구분자의 상대적인 우선 순위 때문에 그런 식으로 분할됩니다.파이썬은 두 개의 수식을 포함하는 튜플을 보는데, 그 중 하나는 두 튜플 간의 등식 테스트 대신에 우연히 등식 테스트입니다.

a = 0, 0 튜플이 될 수 없습니다.튜플은 값들의 집합이며, 균등성 테스트와 달리 할당은 Python에서 값이 없습니다.할당은 식이 아니라 문입니다. 튜플이나 기타 주변 식에 포함할 수 있는 값이 없습니다.만약 당신이 이런 것을 시도했다면.(a = 0), 0튜플로 해석을 강요하기 위해서는 구문 오류가 발생합니다.다로 하면 더 해질 수 . 변수를 작성하면 더 명확해질 수 있습니다.a = (0, 0)- 의 한 유효한 으로서.a = 0, 0.

말입니다.a과 , b.(0,0),그렇게a == b 때문에True.

세 가지 인스턴스에서 모두 볼 수 있는 것은 언어의 문법 사양과 소스 코드에서 발생한 토큰을 구문 분석하여 구문 분석 트리를 생성하는 방법의 결과입니다.

이 낮은 수준의 코드를 보면 후드 아래에서 무슨 일이 일어나는지 이해하는 데 도움이 될 것입니다.는 이 한 다음 할 수 .dis모듈:

1:(0, 0) == 0, 0

>>> dis.dis(compile("(0, 0) == 0, 0", '', 'exec'))
  1           0 LOAD_CONST               2 ((0, 0))
              3 LOAD_CONST               0 (0)
              6 COMPARE_OP               2 (==)
              9 LOAD_CONST               0 (0)
             12 BUILD_TUPLE              2
             15 POP_TOP
             16 LOAD_CONST               1 (None)
             19 RETURN_VALUE

(0, 0)하면 처음입니다.0다에게 됩니다.False 이 합니다를 합니다.0, 그래서 당신은(False, 0).

2:0, 0 == (0, 0)

>>> dis.dis(compile("0, 0 == (0, 0)", '', 'exec'))
  1           0 LOAD_CONST               0 (0)
              3 LOAD_CONST               0 (0)
              6 LOAD_CONST               2 ((0, 0))
              9 COMPARE_OP               2 (==)
             12 BUILD_TUPLE              2
             15 POP_TOP
             16 LOAD_CONST               1 (None)
             19 RETURN_VALUE

은 로 됩니다.0 요소로서 대해서는 첫 하여 두 번째 요소에 대해서는 첫 번째 경우와 동일한 검사를 수행하여 다음과 같이 평가합니다에 대해 합니다.False, 그래서 당신은(0, False).

3:(0, 0) == (0, 0)

>>> dis.dis(compile("(0, 0) == (0, 0)", '', 'exec'))
  1           0 LOAD_CONST               2 ((0, 0))
              3 LOAD_CONST               3 ((0, 0))
              6 COMPARE_OP               2 (==)
              9 POP_TOP
             10 LOAD_CONST               1 (None)
             13 RETURN_VALUE

(0, 0)gTrue.

문제를 설명하는 또 다른 방법:당신은 아마 사전 문헌에 익숙하실 겁니다.

{ "a": 1, "b": 2, "c": 3 }

배열 리터럴(literals.

[ "a", "b", "c" ]

그리고 튜플 리터럴.

( 1, 2, 3 )

하지만 여러분이 깨닫지 못하는 것은, 사전 및 배열 리터럴과는 달리, 튜플 리터럴 주변에서 흔히 볼 수 있는 괄호는 리터럴 구문의 일부가 아니라는 것입니다.튜플의 문자 구문은 쉼표로 구분된 일련의 표현식일 뿐입니다.

1, 2, 3

(Python의 공식 문법 언어로 된 exprlist).

이제 배열 리터럴은 무엇으로 예상하십니까?

[ 0, 0 == (0, 0) ]

평가할 수 있습니까?아마 그것은 그것과 동일해야 할 처럼 훨씬 더 보여요.

[ 0, (0 == (0, 0)) ]

할 수 것입니다.[0, False]가 쳐진 합니다. 마찬가지로, 명시적으로 괄호가 쳐진 튜플 리터럴로

( 0, 0 == (0, 0) )

에 일이 (0, False) 그러나 괄호는 선택사항입니다.

0, 0 == (0, 0)

같은 것입니다.(0, False).


튜플 리터럴 주변의 괄호가 선택 사항인 이유가 궁금하다면, 파괴적인 할당을 그런 식으로 작성해야 하는 것이 귀찮기 때문입니다.

(a, b) = (c, d) # meh
a, b = c, d     # better

작업이 수행되는 순서에 괄호를 몇 개 추가하면 결과를 더 잘 이해하는 데 도움이 될 수 있습니다.

# Build two element tuple comprising of 
# (0, 0) == 0 result and 0
>>> ((0, 0) == 0), 0
(False, 0)

# Build two element tuple comprising of
# 0 and result of (0, 0) == 0 
>>> 0, (0 == (0, 0))
(0, False)

# Create two tuples with elements (0, 0) 
# and compare them
>>> (0, 0) == (0, 0) 
True

쉼표는 표현을 구분하는 데 사용됩니다. 물론 괄호를 사용하여 다른 동작을 강요할 수도 있습니다.나열한 스니펫을 볼 때 쉼표,합니다.합니다.

(0, 0) == 0 ,   0
#-----------|------
  expr 1      expr2

.(0, 0)유사한 방법으로 분해할 수도 있습니다.다로 된 두 합니다.0.

첫 번째 것에서 파이썬은 두 가지로 구성된 튜플을 만들고 있습니다.

  1. 이.(0, 0) == 0로 평가됩니다. 로되는.False
  2. .0

두번째 것은 반대입니다.

이 예를 보십시오.

r = [1,0,1,0,1,1,0,0,0,1]
print(r==0,0,r,1,0)
print(r==r,0,1,0,1,0)

다음 결과:

False 0 [1, 0, 1, 0, 1, 1, 0, 0, 0, 1] 1 0
True 0 1 0 1 0

그런 다음 예제의 첫 번째 숫자(0과 r)만 비교합니다.

저도 비슷한 질문이 있었습니다.저는 컴퓨터 과학자가 아니고 소프트웨어 엔지니어나 컴퓨터 프로그래머입니다.그래서 저는 파이썬 통역사에게 물었고 이것이 제가 경험적으로 발견한 것입니다.

>>> t1 = ()
>>> "True" if t1 else "False"
'False'
>>> t1 = (False)     # That's because t1 is not a tuple!
>>> "True" if t1 else "False"
'False'
>>> t1 = (False,)     # t1 is a tuple.  So , is an operator as mentioned above
>>> "True" if t1 else "False"
'True'
>>> t1 = (False, 1)
>>> "True" if t1 else "False"
'True'
>>> t1 = (False, False)
>>> "True" if t1 else "False"
'True'
>>> type(False,)
<class 'bool'>
>>> type((False,))
<class 'tuple'>
>>> type(False)
<class 'bool'>
>>> type((False))
<class 'bool'>
>>>

많은 테스트를 했는데 False를 평가하는 유일한 튜플은 빈 튜플입니다.

저도 이번 연습에서 배운 점이 있습니다.많은 신인들이 이 관용구를 사용합니다.

if BOOLEAN_EXPRESSION == False:

대신에

if not BOOLEAN_EXPRESSION:

그들은 "왜 이것이 나쁜 일인가?"라고 제게 물었습니다.자, 좋은 대답이 있습니다.

>>> (False,) == False
False
>>> t1=(False,)
>>> "True" if t1 else "False"
'True'
>>> t1 == False
False
>>>
>>> t1=(False,)
>>> "True" if t1 else "False"
'True'
>>> t1 == False
False
>>> t1 is False
False
>>> not t1 is False
True
>>> not ( t1 is False )
True
>>>
>>> "True" if t1 else "False"
'True'
>>> "True" if not t1 else "False"
'False'
>>> "True" if t1 == True else "False"
'False'
>>>


따라서 (False, )가 False로 평가하더라도 False가 아닙니다.

저의 관심에 이 질문을 해주셔서 감사합니다.아주 좋은 질문입니다.

언급URL : https://stackoverflow.com/questions/44864156/why-in-python-does-0-0-0-0-equal-0-false