다음 스 니펫에는 출력이 주석 으로 표시되어 있습니다 (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는 두 번째 포인트를 비교할 수 없도록 수정합니다.