== 와 is는 서로 다른건가요? a is not b 와 a != b의 결과는 다른가요?

 
Seungho Kim

== 와 is는 서로 다른건가요? a is not b 와 a != b의 결과는 다른가요? Django과 shell 에서의 테스트 결과값이 달라서요. 궁금합니다.

  • 남홍김

    네. 다릅니다.
    == 는 값만 비교합니다. is는 객체를 비교합니다.

    예를 들어, a = [], b = [] 각각의 변수에 빈 리스트를 할당한 후에 id(a), id(b)를 해보면 다른 객체임을 알 수 있습니다. 그래서 a is b라고 하면 False를 반환합니다. 반면에 a == b를 하면 두 개의 값은 동일한 빈리스트이기 때문에 True를 반환합니다.

    만약에 a = b = [] 할당한 후에 a is b를 하면 True를 반환합니다. 동일한 객체를 가리키고 있기 때문입니다. 물론 값도 동일하니 a == b도 True를 반환합니다.

    Seungho Kim

    재미있는걸 발견했네요.
    a = 100
    b = 100
    a is b
    True

    a = 500
    b = 500
    a is b
    False

    이렇게 나오는 이유는 python 이 작은 인티저 값은 퍼포먼스 이유로 캐싱해서랍니다.

    SeongMin Park

    Seungho Kim 캐싱이뭔가요??

    Jongyoung Park

    박성민 반복 사용하는 경우를 위해 이전에 사용한 데이터를 빨리 로딩할 수 있게 저장하는 걸 말합니다.

    SeongMin Park

    박종영 감사합니다 ^^

    정호용

    헐 역시 쉬운 언어가 아니었어요

    Kyeong-Mook Kay Cha

    김남홍님 답변에 조금 부연하자면, 객체는 신원 + 타입 + 값으로 구성되어 있는데, `is` 는 신원을 비교하고, `==`는 값을 비교합니다. id 함수는 신원을 확인하는 함수이므로, `id(객체) == id(객체)` 는 `객체 is 객체`와 같은 의미이지요.

    True is 1 => False
    True == 1 => True
    False is 0 => False
    False == 0 => True

Advertisements