2009-11-16 15 views
14

Sto sperimentando con bytes in bytearray in Python 2.6. Non capisco la ragione di alcune differenze.byte vs bytearray in Python 2.6 e 3

A bytes iteratore restituisce stringhe:

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

dà:

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

Ma un iteratore bytearray rendimenti int s:

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

dà:

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

Perché la differenza?

Mi piacerebbe scrivere codice che si traduca bene in Python 3. Quindi, la situazione è la stessa in Python 3?

risposta

24

In Python 2.6 byte è semplicemente un alias per str.
Questo "pseudo tipo" è stato introdotto per [parzialmente] preparare programmi [e programmatori!] Da convertire/compatibile con Python 3.0 dove c'è una netta distinzione di semantica e uso per str (che sono sistematicamente unicode) e byte (che sono matrici di ottetti, per la memorizzazione di dati, ma non di testo)

Analogamente, il prefisso b per le stringhe letterali è inefficace in 2.6, ma è un indicatore utile nel programma, che contrassegna esplicitamente l'intento del programmatore di avere il stringa come una stringa di dati anziché una stringa di testo. Queste informazioni possono quindi essere utilizzate dal convertitore 2to3 o utility simili quando il programma viene portato su Py3k.

Si consiglia di controllare questo SO Question per ulteriori informazioni.

+0

Per maggiori informazioni visita: http://docs.python.org/whatsnew/2.6.html#pep-3112-byte-literals e http://docs.python.org/3.1/library/stdtypes.html# sequence-types-str-bytes-bytearray-list-tuple-range –

3

Non sono sicuro dal quale versione, ma bytes è in realtà un str, che si può vedere se si fa type(bytes(b"hi")) -><type 'str'>.

bytearray è una matrice mutabile di byte, un costruttore di cui prende una stringa.

4

L'ho provato su Python 3.0.

In Python 3.0, un bytes iteratore restituisce int s, non stringhe come ha fatto Python 2.6:

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

dà:

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

Un bytearray iteratore restituisce anche class 'int' s.

+0

Tuttavia, l'oggetto 'bytes' è ancora immutabile, come' str', mentre 'bytearray' è mutabile e ha un'interfaccia' list'-like. –