2009-11-16 22 views
14

Ich experimentiere mit bytes vs bytearray in Python 2.6. Ich verstehe den Grund für einige Unterschiede nicht.Bytes vs Bytearray in Python 2.6 und 3

A bytes Iterator kehrt Strings:

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

Gibt:

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

Aber ein bytearray Iterator gibt int s:

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

Gibt:

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

Warum der Unterschied?

Ich möchte Code schreiben, der sich gut in Python 3 übersetzen lässt. Ist die Situation in Python 3 also die gleiche?

Antwort

24

In Python 2.6 Bytes ist nur ein Alias ​​für str.
Dieser "Pseudotyp" wurde eingeführt, um Programme [und Programmierer!] So vorzubereiten, dass sie mit Python 3.0 konvertierbar/kompatibel sind, wobei es eine strikte Trennung von Semantik und Verwendung für str (die systematisch Unicode sind) und Bytes (die sind Arrays von Oktetts, zum Speichern von Daten, aber nicht Text)

Ebenso ist das b-Präfix für String-Literale in 2.6 unwirksam, aber es ist ein nützlicher Marker im Programm, der ausdrücklich die Absicht des Programmierers kennzeichnet Zeichenfolge als Datenzeichenfolge anstelle einer Textzeichenfolge. Diese Informationen können dann vom 2to3-Konverter oder ähnlichen Dienstprogrammen verwendet werden, wenn das Programm nach Py3k portiert wird.

Sie können diese SO Question für weitere Informationen überprüfen.

+0

Weitere Informationen finden Sie unter: http://docs.python.org/whatsnew/2.6.html#pep-3112-byte-literals und http://docs.python.org/3.1/library/stdtypes.html# sequence-types-str-bytes-bytearray-list-tuple-bereich –

3

Ich bin da, welche Version nicht sicher, aber bytes ist eigentlich ein str, die Sie, wenn Sie type(bytes(b"hi")) tun sehen -><type 'str'>.

bytearray ist ein veränderbares Array von Bytes, von denen ein Konstruktor eine Zeichenfolge benötigt.

4

Ich habe es auf Python 3.0 versucht.

In Python 3.0, ein bytes Iterator zurückgibt int s, keine Strings als Python 2.6 hat:

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

Gibt:

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

A bytearray Iterator gibt auch class 'int' s.

+0

Allerdings ist das 'bytes'-Objekt immer noch unveränderlich, wie' str', während 'bytearray' veränderbar ist und eine listenähnliche Schnittstelle hat. –