Python Strinh Immutability Broken!

Terry Reedy tjreedy at udel.edu
Tue Aug 26 22:25:04 EDT 2008



Hendrik van Rooyen wrote:

> Terry Reedy:

>> Which essentially is the bytearray type of 3.0.
> 
> How does it differ from plain old array.array(b,”The quick brown fox”)?

The typecode must be quoted as 'b'.
In 3.0, strings become unicode, so an added b prefix is needed.
 >>> import array
 >>> a = array.array('b', b'fox')
 >>> b=bytearray(b'fox')

As to your question: the underlying implementation of bytearrays is 
based on that of array('b')s. Bytearrays are built in so no import is 
needed.  Dir() shows that both have all sequence methods, but arrays 
also have list methods, while bytearrays also have string/bytes methods.

They have different representations
 >>> a
array('b', [102, 111, 120])
 >>> b
bytearray(b'fox')

Bytearrays, like lists/arrays, have the __setitem__ method needed to 
make them mutable via indexing.

 >>> a[0]=ord(b'b')
 >>> b[0]=ord(b'b')
 >>> a
array('b', [98, 111, 120])
 >>> b
bytearray(b'box')

Arrays can extend bytearrays but not vice versa.  This may be a glitch.

 >>> c = a + b
Traceback (most recent call last):
   File "<pyshell#24>", line 1, in <module>
     c = a + b
TypeError: can only append array (not "bytearray") to array
 >>> c = b + a
 >>> c
bytearray(b'boxbox')

Either can initialize the other

 >>> d = array.array('b',c)
 >>> d
array('b', [98, 111, 120, 98, 111, 120])
 >>> c=bytearray(d)
 >>> c
bytearray(b'boxbox')

So if one does more that the common mutable sequence operations, there 
is a basis for choosing one or the other.

Terry Jan Reedy




More information about the Python-list mailing list