2015-05-09 19 views
5

Qual è la differenza tra bytearray e, ad esempio, uno list o tuple?Differenza tra bytearray e lista

Come suggerisce il nome, bytearray deve essere uno array che trasporta oggetti byte.
In Python, sembra che bytes e str vengono trattati allo stesso modo

>>> bytes 
<type 'str'> 

Quindi, qual è la differenza?
Inoltre, se si stampa un bytearray, il risultato è piuttosto strano

>>> v = bytearray([200, 201]) 
>>> print v 
ÈÉ 

Sembra che trasforma il numero intero in chr(integer), è giusto? A cosa serve poi un bytearray?

+1

Contrassegna la tua versione python, per favore, perché 'str' differisce pesantemente tra python 2 e python 3. – dhke

+0

Ben notato! È 'python- 2.7' – RafaelC

+0

Vedi qui https://stackoverflow.com/questions/9099145/where-are-python-bytearrays-used – dhke

risposta

9

Si è corretti in qualche modo: in Python 2, bytes è sinonimo del tipo str. Questo perché originariamente non esisteva l'oggetto bytes, c'era solo lo str e lo unicode (quest'ultimo essendo per stringa unicode, cioè con capacità multi-byte). Quando è arrivato Python 3, hanno cambiato l'intera stringa e hanno reso unicode il tipo predefinito Python 3 str e hanno aggiunto bytes come tipo per le sequenze di byte non elaborate (rendendolo equivalente all'oggetto str di Python 2).

Così, mentre in Python 3 si differiva tra str e bytes, i tipi corrispondenti in Python 2 sono unicode e str.

Ora ciò che rende interessante il tipo bytearray è che è mutabile. Tutte le sequenze di stringhe e byte di cui sopra sono immutabili, quindi ad ogni modifica viene creato un nuovo oggetto. Ma è possibile modificare gli oggetti bytearray, rendendoli interessanti per vari scopi in cui è necessario modificare singoli byte in una sequenza.

+1

L'altra cosa che rende' bytearray' interessante (rispetto a 'str' di Python, non tanto rispetto ai 'byte" di Python 3 è che è un po 'ambiguo di cosa si tratti. In Python 2, a volte i byte sono caratteri e talvolta sono piccoli numeri. se '= bytearray ([97,98,99])', 'repr (b)' ti dà 'bytearray (b'abc ')'. Ma 'b [0]' ti dà '97'. Questo può essere fonte di confusione se sei abituato a 'str' nasconderlo da te e costringerti a chiamare' ord' e 'chr' (' 'abc' [0] 'è' 'a'', non 97). – abarnert