Python/파이썬 기초

파이썬 자료형별 '같다'의 기준 정리(비교연산자 == 기준), 클래스에서 == 및 != 구현 방법(__eq__, __ne__)

jimmy_AI 2022. 7. 13. 14:04
반응형

Python ==, != 자료형별 기준 및 클래스 내 구현 예제

파이썬에서 숫자형, 문자열, 리스트 및 딕셔너리 등 여러 자료형의

비교 연산자에서 같음이 성립하는 기준을 정리해보고,

직접 구현된 클래스 객체 간의 비교 연산자 결과를 구현해보는 예제를 다루어보도록 하겠습니다.

 

 

자료형별 '같다'의 기준(== 결과 True) 예제

1. 정수형

a = 1
b = 1
c = 2

print(a == b) # True
print(a == c) # False

정수형의 경우 같은 숫자라면 True, 다른 숫자라면 False가 반환됩니다.

 

2. 실수형

a = 0.1
b = 0.10000000000000
c = 0.10000000000001

print(a == b) # True
print(a == c) # False

실수형의 경우도 정수형과 마찬가지로 같은 숫자의 경우 True가 반환되는데,

부동소수점의 미세한 결과 차이만 달라도 False가 반환되므로 유의하셔야 합니다.

 

또한, 정수형 1과 실수형 1.0은 파이썬에서는 같은 수로 인식합니다.

 

3. 문자열

a = "abc"
b = "abc"
c = "abc "

print(a == b) # True
print(a == c) # False

모든 위치의 문자가 전부 일치한다면 같은 문자열, 단 1글자라도 다르다면

다른 문자열로 인식합니다.(공백 추가 여부 등도 전부 포함)

 

또한, 정수형 3과 문자열 '3'은 자료형부터 다르기에 다른 객체로 취급됩니다.

 

4. 리스트

a = [1, 2, 3]
b = [1, 2, 3]
c = [1, 2, 4]

print(a == b) # True
print(a == c) # False

문자열에서의 원리와 마찬가지로 모든 위치의 값이 전부 일치한다면 같은 리스트,

단 1개의 값이라도 다르다면 다른 리스트로 인식합니다.

 

5. 딕셔너리

a = {"a" : 3, "b" : 5}
b = {"b" : 5, "a" : 3}
c = {"a" : 3, "b" : 7}

print(a == b) # True
print(a == c) # False

딕셔너리는 순서가 없는 자료형이므로 key, value가 저장된 순서는 상관이 없고

key-value pair의 구성이 전부 일치하면 같은 딕셔너리로 취급합니다.

(단, 한 군데라도 key-value pair의 구성이 다르다면 다른 객체로 다룹니다.)

 

반응형

 

클래스에서 ==, != 결과 구현(__eq__, __ne__)

직접 구현한 클래스 간의 비교를 진행하고 싶다면

== 결과는 __eq__ 매직 메소드로, != 결과는 __ne__ 매직 메소드로 구현해주시면 됩니다.

 

아래는 a1, a2라는 두 개의 속성을 가지는 클래스를 구현한 예시이며,

a1 값만 비교하여 해당 값이 같다면 같은 객체로 구분하도록 구현한 경우입니다.

(a2 값은 비교 연산자의 결과에 반영하지 않게 만들었다는 점을 참고하세요.)

class My_class:
    def __init__(self, a1, a2): # a1, a2 두 개의 속성을 가지는 클래스
        self.a1 = a1
        self.a2 = a2

    # a1 값만 비교하도록 비교 연산 진행
    def __eq__(self, other): # == 연산 결과 정의
        if self.a1 == other.a1: return True
        else: return False

    def __ne__(self, other): # != 연산 결과 정의
        return not self.__eq__(other) # == 결과의 반대값 반환

 

실제로 해당 클래스 객체를 몇 개 선언하여 비교 연산을 진행해본 결과는 아래와 같습니다.

class1 = My_class(a1 = 5, a2 = 3)
class2 = My_class(a1 = 5, a2 = 7)
class3 = My_class(a1 = 3, a2 = 3)

# class1, class2 객체는 a1 값이 같아서 == 결과 성립
print(class1 == class2) # True
print(class1 != class2) # False

# class1, class3 객체는 a1 값이 달라서 != 결과 성립
print(class1 == class3) # False
print(class1 != class3) # True