[python] 파이썬 2는 문자열과 int를 어떻게 비교합니까? 왜 목록이 숫자보다 큰지, 튜플이 목록보다 큰지?

다음 스 니펫에는 출력이 주석 으로 표시되어 있습니다 (ideone.com 참조 ).

print "100" < "2"      # True
print "5" > "9"        # False

print "100" < 2        # False
print 100 < "2"        # True

print 5 > "9"          # False
print "5" > 9          # True

print [] > float('inf') # True
print () > []          # True

누군가 출력이 왜 그런지 설명 할 수 있습니까?


구현 세부 사항

  • 이 동작은 언어 사양에 의해 지시됩니까, 아니면 구현 자에게 달려 있습니까?
  • 주요 Python 구현 사이에 차이점이 있습니까?
  • 파이썬 언어 버전간에 차이가 있습니까?


답변

로부터 파이썬이 매뉴얼 :

CPython 구현 세부 사항 : 숫자를 제외한 다른 유형의 오브젝트는 유형 이름으로 정렬됩니다. 적절한 비교를 지원하지 않는 동일한 유형의 객체는 주소별로 정렬됩니다.

두 개의 문자열 또는 두 개의 숫자 유형을 주문할 경우 순서는 예상 된 방식으로 수행됩니다 (문자열의 사전 순서, 정수의 숫자 순서).

숫자 및 숫자가 아닌 유형을 주문하면 숫자 유형이 먼저 나타납니다.

>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True

둘 중 어느 것도 숫자가 아닌 두 가지 호환되지 않는 유형을 주문하면 유형 이름의 알파벳 순서로 정렬됩니다.

>>> [1, 2] > 'foo'   # 'list' < 'str' 
False
>>> (1, 2) > 'foo'   # 'tuple' > 'str'
True

>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True

한 가지 예외는 항상 새로운 스타일 클래스보다 먼저 오는 구식 클래스입니다.

>>> class Foo: pass           # old-style
>>> class Bar(object): pass   # new-style
>>> Bar() < Foo()
False

이 동작은 언어 사양에 의해 지시됩니까, 아니면 구현 자에게 달려 있습니까?

언어 사양없습니다 . 언어 참조는 말합니다 :

그렇지 않으면 다른 유형의 객체는 항상 같지 않고 일관되게 그러나 임의로 정렬됩니다.

따라서 구현 세부 사항입니다.

주요 Python 구현 사이에 차이점이 있습니까?

공식 CPython 구현 만 사용했기 때문에 대답 할 수는 없지만 PyPy와 같은 다른 Python 구현이 있습니다.

파이썬 언어 버전간에 차이가 있습니까?

Python 3.x에서 정수와 문자열을 주문하면 오류가 발생하도록 동작이 변경되었습니다.

>>> '10' > 5
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    '10' > 5
TypeError: unorderable types: str() > int()


답변

문자열 사전 식 으로 비교하고 다른 유형은 해당 유형의 이름 ( "int"< "string")으로 비교합니다. 3.x는 두 번째 포인트를 비교할 수 없도록 수정합니다.


답변