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


178

다음 스 니펫에는 출력이 주석 으로 표시되어 있습니다 (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 구현 사이에 차이점이 있습니까?
  • 파이썬 언어 버전간에 차이가 있습니까?

23
이 질문의 3000 DUPS 중 이 하나 설명하는 대답이 언어가 이런 식으로 디자인 된 (그리고 그것은 3.x를 재 설계 한 이유를). 그것은이 질문의 일부는 아니지만 여기에 연결된 많은 질문의 일부입니다.
abarnert

답변:


209

로부터 파이썬이 매뉴얼 :

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()

55
Py3k에서 변경 한 것이 좋습니다. 이 질문을 처음봤을 때, 내 생각은 '무슨 일 이니?
JAL

9
NB 유형 이름에 따라 다른 유형이 정렬되는 2.x 규칙의 예외는 None 개체가 항상 다른 모든 유형보다 작다는 것입니다. 3.x에서 None을 다른 형식과 비교하면 여전히 TypeError가 발생합니다.
Dave Kirby

4
@KarelBilek : bool은 숫자 유형입니다. 그리고 True == 1이므로 <도>도 아닙니다.
abarnert

3
유형 이름의 사전 순서? 언제이 기능을 원하십니까? 누가 그걸 사용했을까요?

3
재미있는 사실은 : complex(1,0) > 'abc'입니다 False하지만 complex(1,0) > complex(0,0)제기TypeError
에릭 Duminil

24

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


3
그러나 python2에서 int는 dicts보다 작으므로 형식 이름으로 사전 식으로 할 수는 없습니까?
Tony Suffolk 66

나는이 답변을 보았고 Tony Suffolk에 동의합니다. 유형 이름에 따라 객체가 정렬되지 않습니다.
Exelian

@ TonySuffolk66 숫자 유형은 해당 규칙에서 예외입니다. NumericType은 2.7의 다른 유형 (NoneType 제외)보다 항상 낮습니다.
lef
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.