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