수색…


통사론

  • ! = - 같지 않음

  • == - 같음

  • > -보다 큼

  • < -보다 작음

  • >= -보다 크거나 같음

  • <= -보다 작거나 같음

  • is - 객체가 정확히 같은 객체인지 테스트합니다.

  • 객체가 정확히 같은 객체가 아닌지 테스트하지 않습니다.

매개 변수

매개 변수 세부
엑스 비교할 첫 번째 항목
와이 비교할 두 번째 항목

보다 크거나 작음

x > y
x < y

이 연산자는 두 가지 유형의 값을 비교합니다.이 값은 연산자보다 작거나 큽니다. 숫자의 경우 단순히 수치 값을 비교하여 어느 것이 더 큰지를 비교합니다.

12 > 4
# True
12 < 4
# False
1 < 4
# True

문자열의 경우 알파벳순으로 비교하지만 알파벳 순서와 유사하지만 완전히 동일하지는 않습니다.

"alpha" < "beta"
# True
"gamma" > "beta"
# True
"gamma" < "OMEGA"
# False

이러한 비교에서 소문자는 대문자보다 큰 것으로 간주되므로 "gamma" < "OMEGA" 가 거짓입니다. 모두 대문자 일 경우 예상되는 알파벳순 정렬 결과를 반환합니다.

"GAMMA" < "OMEGA"
# True

각 유형은 <> 연산자를 다르게 계산하므로 연산자를 사용하기 전에 주어진 유형에 대해 연산자가 의미하는 바를 조사해야합니다.

같지 않음

x != y  

xy 가 같지 않으면 True 반환하고 그렇지 않으면 False 반환합니다.

12 != 1
# True
12 != '12'
# True
'12' != '12'
# False

동일

x == y 

이 표현식은 xy 가 같은 값인지 판단하고 결과를 부울 값으로 반환합니다. 일반적으로 타입과 값이 모두 일치해야하므로 int 12 는 문자열 '12' 와 동일하지 않습니다.

12 == 12
# True
12 == 1
# False
'12' == '12'
# True
'spam' == 'spam'
# True
'spam' == 'spam '
# False
'12' == 12
# False

각 유형은 두 값이 같은지 평가하는 데 사용될 함수를 정의해야합니다. 내장 함수의 경우이 함수는 예상대로 동작하고 동일한 값을 기준으로 평가합니다. 그러나 사용자 정의 유형은 평등 테스트를 항상 원하는 값으로 정의 할 수 있습니다. 항상 True 반환하거나 항상 False 반환합니다.

체인 비교

체인 비교를 통해 여러 항목을 여러 비교 연산자와 비교할 수 있습니다. 예를 들어

x > y > z

단지 짧은 형식 일뿐입니다.

x > y and y > z

이것은로 평가됩니다 True 모두 비교가있는 경우에만 True .

일반적인 형식은 다음과 같습니다.

a OP b OP c OP d ...

여기서 OP 는 사용할 수있는 다중 비교 연산 중 하나를 나타내며 문자는 임의의 유효한 표현식을 나타냅니다.

0 != 1 != 00 != 0False 임에도 불구하고 True 평가됩니다. x != y != z 라는 일반적인 수학 표기법과는 달리 x , yz 는 다른 값을 갖습니다. Chaining == 연산은 대부분 평등이 일반적으로 전이 적이기 때문에 자연스러운 의미를 지닙니다.

스타일

적절한 구문을 사용하는 동안 얼마나 많은 항목과 비교 연산을 사용하는지 이론적으로 제한하지 않습니다.

1 > -1 < 2 > 0.5 < 100 != 24

각 비교 결과가 True 이면 위의 값은 True 반환합니다. 그러나 복잡한 체인을 사용하는 것은 좋은 스타일이 아닙니다. 좋은 연결 고리는 "지향성"이 될 것이고,

1 > x > -4 > y != 8

부작용

즉시 하나 개의 비교가 반환로 False , 표현은 즉시 평가 False 남아있는 모든 비교를 건너 뜁니다.

a > exp > b 의 표현식 exp 는 한 번만 평가되는 반면,

a > exp and exp > b

expa > exp 경우 a > exp 가 두 번 계산됩니다.

`is 'vs`==`에 의한 비교

일반적인 함정은 동등 비교 연산자를 혼란 is== .

a == bab 의 값을 비교합니다.

a is b신원 비교합니다 와 a b .

설명하기 :

a = 'Python is fun!'
b = 'Python is fun!'
a == b # returns True
a is b # returns False

a = [1, 2, 3, 4, 5]
b = a      # b references a
a == b     # True
a is b     # True
b = a[:]   # b now references a copy of a
a == b     # True
a is b     # False [!!]

기본적 is 뿐만 속기 생각할 수 id(a) == id(b) .

이 외에도 런타임 환경의 단점이있어 상황을 더욱 복잡하게 만듭니다. 짧은 문자열과 작은 정수는 Python 컴퓨터가 동일한 개체에 대해 더 적은 메모리를 사용하려고하기 때문에 is 와 비교할 때 True 를 반환합니다.

a = 'short'
b = 'short'
c = 5
d = 5
a is b # True
c is d # True

그러나 긴 문자열과 큰 정수는 별도로 저장됩니다.

a = 'not so short'
b = 'not so short'
c = 1000
d = 1000
a is b # False
c is d # False

당신 사용해야은 is 를 테스트 None :

if myvar is not None:
    # not None
    pass
if myvar is None:
    # None
    pass

의 사용 is 에 "감시"(즉, 고유의 오브젝트)를 테스트하는 것입니다.

sentinel = object()
def myfunc(var=sentinel):
    if var is sentinel:
        # value wasn’t provided
        pass
    else:
        # value was provided
        pass

객체 비교하기

사용자 정의 클래스의 평등을 비교하려면 __eq____ne__ 메소드를 정의하여 ==!= 을 겹쳐 쓸 수 있습니다. __lt__ ( < ), __le__ ( <= ), __gt__ ( > ) 및 __ge__ ( > )를 재정의 할 수도 있습니다. 두 가지 비교 메소드 만 재정의하면되고 나머지는 Python이 처리 할 수 ​​있습니다 ( ==not <not > not < 것과 같습니다).

class Foo(object):
    def __init__(self, item):
        self.my_item = item
    def __eq__(self, other):
        return self.my_item == other.my_item
    
a = Foo(5)
b = Foo(5)
a == b     # True
a != b     # False
a is b     # False

이 간단한 비교는 other (비교 대상 객체)가 동일한 객체 유형이라고 가정합니다. 다른 유형과 비교하면 오류가 발생합니다.

class Bar(object):
    def __init__(self, item):
        self.other_item = item
    def __eq__(self, other):
        return self.other_item == other.other_item
    def __ne__(self, other):
        return self.other_item != other.other_item
    
c = Bar(5)
a == c    # throws AttributeError: 'Foo' object has no attribute 'other_item'

isinstance() 또는 이와 유사한 것을 확인하면이 문제를 방지하는 데 도움이됩니다 (원하는 경우).

Common Gotcha : 파이썬은 타이핑을 강제하지 않습니다.

다른 많은 언어에서 다음을 실행하면 (Java 예제)

if("asgdsrf" == 0) {
    //do stuff
}

... 오류가 발생합니다. 당신은 문자열을 그것과 같은 정수와 비교할 수 없습니다. 파이썬에서 이것은 완벽하게 합법적 인 성명서입니다. 단지 False 됩니다.

일반적인 잡았다는 다음과 같습니다

myVariable = "1"
if 1 == myVariable:
    #do stuff

이 비교는 매번 오류없이 False 평가되어 잠재적으로 버그를 숨기거나 조건을 위반합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow