문제

나는 실험하고있다 bytes vs bytearray 파이썬에서 2.6. 차이가있는 이유를 이해하지 못합니다.

bytes 반복자는 문자열을 반환합니다.

for i in bytes(b"hi"):
    print(type(i))

제공 :

<type 'str'>
<type 'str'>

그러나 a bytearray 반복자가 반환됩니다 int에스:

for i in bytearray(b"hi"):
    print(type(i))

제공 :

<type 'int'>
<type 'int'>

왜 차이인가?

Python 3으로 잘 변환되는 코드를 작성하고 싶습니다. 그렇다면 Python 3에서 상황이 동일합니까?

도움이 되었습니까?

해결책

Python 2.6 바이트는 단지 STR의 별칭 일뿐입니다..
이 "의사 유형"은 [부분적으로] 준비 프로그램 [및 프로그래머!]에 소개되어 STR (체계적으로 유니 코드) 및 바이트 (배열 인 STR) 및 바이트에 대한 의미와 사용이 엄격한 파이썬 3.0으로 변환/호환됩니다. 데이터 저장을 위해 옥제의 옥제, 텍스트가 아닌)

마찬가지로 문자열 리터럴에 대한 B 접두사는 2.6에서 효과가 없지만 프로그램에서 유용한 마커이며, 프로그래머가 텍스트 문자열이 아닌 데이터 문자열로 문자열을 갖도록 프로그래머의 의도를 명시 적으로 플래그합니다. 그런 다음 프로그램이 PY3K로 포팅 될 때 2To3 컨버터 또는 유사한 유틸리티 에서이 정보를 사용할 수 있습니다.

이것을 확인하고 싶을 수도 있습니다 그래서 질문 추가 정보.

다른 팁

(적어도) 파이썬 3.7

문서에 따르면 :

bytes 물체는 불변의 단일 바이트 시퀀스입니다

bytearray 객체는 바이트 객체를 바이트하는 상대입니다.

그리고 그것은 거의 멀리 있습니다 bytes vs bytearray. 사실, 그들은입니다 상호 교환 가능 오류를 던지지 않고 작업에 혼합 될 수있을 정도로 유연하게 설계되었습니다. 실제로, 전체 섹션이 있습니다. 공식 문서 사이의 유사성을 보여주는 데 전념합니다 bytes 그리고 bytearray 아피스.

왜 문서에서 나온 이유에 대한 단서 :

많은 주요 바이너리 프로토콜은 ASCII 텍스트 인코딩을 기반으로하기 때문에 바이트 객체는 ASCII 호환 데이터로 작업 할 때만 유효한 몇 가지 방법을 제공하며 다양한 다른 방식으로 문자열 객체와 밀접하게 관련되어 있습니다.

tl; dr

python2.6+ bytes = python2.6+ str = python3.x bytes ! = python3.x str

python2.6+ bytearray = python3.x bytearray

python2.x unicode = python3.x str

긴 대답

bytes 그리고 str 파이썬 3.x 이후 파이썬에서 의미가 바뀌 었습니다.

먼저 질문에 곧 답변하십시오, 파이썬 2.6 bytes(b"hi") 불변의 바이트 배열 (8 비트 또는 옥셋)입니다. 그래서 각각의 유형 byte 간단합니다 byte, 그것은 동일합니다 str Python 2.6+에서 (그러나 이것은 Python 3.x의 경우는 아닙니다)

bytearray(b"hi") 다시 바이트 배열입니다. 그러나 당신이 그 유형을 물을 때, 그것은 int, 파이썬은 각 요소를 나타 내기 때문에 bytearray 범위 0-255의 정수로서 (8 비트 정수의 모든 가능한 값). 그러나 요소 bytes 배열은 바이트의 ASCII 값으로 표시됩니다.

예를 들어, 고려하십시오 파이썬 2.6+

>>> barr=bytearray(b'hi')
>>> bs=bytes(b'hi')
>>> barr[0] # python shows you an int value for the 8 bits 0110 1000
104 
>>> bs[0] # python shows you an ASCII value for the 8 bits 0110 1000
'h'
>>> chr(barr[0]) # chr converts 104 to its corresponding ASCII value
'h'
>>> bs[0]==chr(barr[0]) # python compares ASCII value of 1st byte of bs and ASCII value of integer represented by first byte of barr
True

이제 Python 3.x는 완전히 다른 이야기입니다. 당신이 의심했듯이, 왜 str 문자 그럴은 a를 의미합니다 byte Python2.6+에서. 잘 이 답변은 그것을 설명합니다

Python 3.x에서 str 유니 코드 텍스트입니다 (이전에는 바이트 배열이었던 유니 코드와 바이트는 완전히 다른 두 가지입니다). bytearray a 변하기 쉬운 바이트 배열 중 bytes 이다 불변 바이트 배열. 둘 다 거의 같은 기능을 가지고 있습니다. 이제 Python 3.x에서 위의 동일한 코드를 다시 실행하면 결과가 있습니다. ~ 안에 파이썬 3.x

>>> barr=bytearray(b'hi')
>>> bs=bytes(b'hi')
>>> barr[0]
104
>>> bs[0]
104
>>> bs[0]==barr[0] # bytes and bytearray are same thing in python 3.x
True

bytes 그리고 bytearray 돌연변이를 제외하고는 Python 3.x에서 동일합니다.

무슨 일이 있었는지 str 물어볼 수 있습니까? str Python 3에서는 무엇으로 변환되었습니다 unicode Python 2에 있었고 unicode 이어서 파이썬 3에서 유형이 중복되어 제거되었습니다.

Python 3으로 잘 변환되는 코드를 작성하고 싶습니다. 그렇다면 Python 3에서 상황이 동일합니까?

그것은 당신이하려는 일에 달려 있습니다. 바이트를 다루고 있습니까? 아니면 바이트의 ASCII 표현을 다루고 있습니까?

바이트를 다루는 경우, 그러면 제 조언은 사용하는 것입니다 bytearray 파이썬 2에서는 파이썬 3에서 동일하지만, 당신은 당신에게 중요하다면 당신은 불변성을 느슨하게합니다.

ASCII 또는 텍스트를 다루는 경우, 그런 다음 문자열을 다음과 같이 나타냅니다 u'hi' Python 2에서, 그것은 Python 3에서 동일한 의미를 갖습니다. 'u' Python 2에는 특별한 의미가 있으며, 이는 Python 2를 문자열을 문자 그대로 처리하도록 지시합니다. unicode 유형. Python 3의 'u' str Python 3을 입력하고 unicode Python 2를 입력하십시오).

나는 어떤 버전 이후로 확실하지 않지만 bytes 실제로 a str, 당신이 할 수 있는지 볼 수 있습니다 type(bytes(b"hi")) -> <type 'str'>.

bytearray 바이트의 변이 가능한 배열이며, 하나의 생성자는 문자열을 취합니다.

Python 3.0에서 시도했습니다.

Python 3.0에서 a bytes 반복자가 반환됩니다 intS, Python 2.6과 같은 문자열이 아닙니다.

for i in bytes(b"hi"):
    print(type(i))

제공 :

<class 'int'>
<class 'int'>

bytearray 반복자도 반환합니다 class 'int'에스.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top