2009-11-16 15 views
14

Estoy experimentando con bytes vs bytearray en Python 2.6. No entiendo el motivo de algunas diferencias.bytes vs bytearray en Python 2.6 y 3

A bytes iterador devuelve cadenas:

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

da:

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

Sin embargo, un iterador bytearray retornos int s:

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

da:

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

¿Por qué la diferencia?

Me gustaría escribir un código que se traduzca bien en Python 3. Entonces, ¿la situación es la misma en Python 3?

Respuesta

24

En Python 2.6 bytes es simplemente un alias para str.
Este "pseudo tipo" se introdujo para [parcialmente] preparar programas [y programadores!] Para convertir/compatible con Python 3.0 donde hay una distinción estricta de semántica y uso para str (que son sistemáticamente unicode) y bytes (que son matrices de octetos, para almacenar datos, pero no texto)

De manera similar, el prefijo b para literales de cadena no es efectivo en 2.6, pero es un marcador útil en el programa, que indica explícitamente la intención del programador de tener el cadena como una cadena de datos en lugar de una cadena de texto. Esta información puede ser utilizada por el convertidor 2to3 o utilidades similares cuando el programa se transporta a Py3k.

Es posible que desee comprobar este SO Question para obtener información adicional.

+0

Para obtener más información, consulte: http://docs.python.org/whatsnew/2.6.html#pep-3112-byte-literals y http://docs.python.org/3.1/library/stdtypes.html# sequence-types-str-bytes-bytearray-list-tuple-range –

3

No estoy seguro de qué versión ya, pero es en realidad un bytesstr, que se puede ver si lo hace type(bytes(b"hi")) -><type 'str'>.

bytearray es una matriz mutable de bytes, cuyo constructor toma una cadena.

4

Lo intenté en Python 3.0.

En Python 3.0, un iterador devuelve bytesint s, y no como lo hizo cadenas de Python 2.6:

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

da:

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

Un iterador bytearray también devuelve class 'int' s.

+0

Sin embargo, el objeto 'bytes' es aún inmutable, como' str', mientras que 'bytearray' es mutable y tiene una interfaz tipo' list'. –