isinstance ( 'aaa', basestring)와 isinstance ( 'aaa', str)의 차이점은 무엇입니까?


답변:


387

3.0 이전의 Python 버전에는 "일반 문자열"과 "유니 코드 문자열"이라는 두 종류의 문자열이 있습니다. 일반 문자열 ( str)은 라틴 알파벳 이외의 문자를 나타낼 수 없습니다 (단순화를 위해 코드 페이지의 세부 사항은 무시). 유니 코드 문자열 ( unicode)은 Klingon과 같은 가상의 문자를 포함하여 모든 알파벳의 문자를 나타낼 수 있습니다.

그렇다면 두 종류의 문자열이있는 이유는 모든 경우를 다루기 때문에 유니 코드를 갖는 것이 낫지 않습니까? 글쎄, 유니 코드 만 갖는 것이 낫지 만 유니 코드가 문자열을 나타내는 데 선호되는 방법 전에 파이썬이 만들어졌습니다. 많은 사용자가있는 언어에서 문자열 유형을 전환하는 데 시간이 걸리며, Python 3.0에서는 모든 문자열이 유니 코드 인 경우가 있습니다.

3.0 이전의 Python 문자열의 상속 계층 구조는 다음과 같습니다.

          object
             |
             |
         basestring
            / \
           /   \
         str  unicode

파이썬 2.3에서 소개 된 'basestring'은 객체가 인스턴스인지 str또는 인스턴스인지를 확인하는 데 사용될 수 있으므로 문자열 통합 방향의 단계로 생각할 수 있습니다.unicode

>>> string1 = "I am a plain string"
>>> string2 = u"I am a unicode string"
>>> isinstance(string1, str)
True
>>> isinstance(string2, str)
False
>>> isinstance(string1, unicode)
False
>>> isinstance(string2, unicode)
True
>>> isinstance(string1, basestring)
True
>>> isinstance(string2, basestring)
True

13
파이썬 3에서 변경 되었습니까? 새로운 있는가 strbyte의 여전히 아이들은 basestring? 이것에 대한 메모를 추가 할 가치가 있습니다.
MestreLion

14
@MestreLion : 변경되었습니다. Py3에는 없습니다 basestringstrbytes모두 서브 클래스를 object직접. 그러나 Py2 str는 Py3과 같지 않기 때문에 이것은 의미 가 bytes있습니다. basestring"문자열"로 생각해야하며, Py3에는 str. 따라서 2to3공구가로 대체 basestring됩니다 str.
Søren Løvborg

8

모든 문자열은 기본 문자열이지만 유니 코드 문자열은 str 유형이 아닙니다. 대신 이것을 시도하십시오 :

>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False

4

실제로 당신이 요구하는 것은 기본 문자열과 str 클래스의 차이점입니다.

Str은 basestr에서 상속받은 클래스입니다. 그러나 유니 코드 문자열은 다른 문자열과 마찬가지로 존재하기 때문에 존재합니다.

>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True

1

Basestring은 문자열의 슈퍼 클래스입니다. 귀하의 예에서 a는 "str"유형이므로 기본 문자열이자 str입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.