2015-01-31 19 views
13

Python 3.4 bir bayt dizesi ilk kömürü almaya çalışıyorum ama ne zaman indeksi bunu, ben bir int olsun: Ben almak için bekliyordum olarak,Baytları indekslediğimde neden int alırım?

>>> my_bytes = b'just a byte string' 
b'just a byte string' 
>>> my_bytes[0] 
106 
>>> type(my_bytes[0]) 
<class 'int'> 

Bu benim için unintuitive görünüyor b'j'.

Beklediğim değeri alabildiğimi keşfettim, ama bana bir kesmek gibi geldi.

>>> my_bytes[0:1] 
b'j' 

Birisi bunun neden olduğunu açıklayabilir mi?

+1

Neden bunun için bir reddetme ve closevote hak ettiğinden emin değilim. Birisi sorunun nasıl geliştirilebileceğini açıklayabilir mi? – meshy

+3

Oy vermedim; Birisi kendileri için açık olduğunu hissettim sanırım ve belgeler bu tür için böyle olduğunu belirtir. Yakın-oy, off-base yoludur (* Unclear *? Bu benim için tamamen açık bir sorudur). –

+1

'my_bytes [0: 1] gibi bir aralık kullanmanın hacklemi gerçekten Python2/Python3 uyumlu kodu yazmamda bana yardımcı oldu. Bu sorunu ele alan uyumlu kod için en iyi uygulamayı içeren bir yanıt görmeyi çok isterim. Örneğin: 'ord (my_bytes [0])' Python2'de bir int verir, ancak 'my_bytes [0]' Python3'te bir int verir. Her ikisinde de çalışmak için, Python3 için gerçekten çirkin görünen ord (my_bytes [0: 1]) kullanıyorum. – proximous

cevap

13

bytes tipi Binary Sequence type ve açık belgelerine 255

, aralık 0 tamsayı dizisi ihtiva eden belgelenmiştir:

bayt nesneleri tek baytlık sabit dizileridir .

[...] bayt sabitleri ve temsiller ASCII metni dayanıyor olsa da, nesneleri aslında bu şekilde 0 <= x < 256 sınırlı sırayla her bir değer ile, tamsayılar değişmez dizileri gibi davranmaya bayt

[.]

[...]

bayt nesneler (bir başlığın benzer) tam sayı dizileri olduğu

b[0:1] birolacak ise, bir bayt nesnesi b için, b[0], bir tamsayıdır olacakuzunluğunun nesnesi 1. (Bu, hem indekslemenin hem de dilimlemenin 1 uzunluğunda bir dizi oluşturacağı metin dizgileriyle çelişir).

Koyu vurgu benim. Dizgeyi dizine eklemek yerine, dizi tipleri arasında bir istisna vardır; 'abc'[0], size bir str nesnesinin bir uzunluğunu verir; str, her zaman kendi türünün öğelerini içeren tek dizidir.

Bu, diğer dillerin dize verilerini nasıl işlediğini gösterir; C 'de unsigned char type da etkili bir şekilde 0-255 aralığında bir tamsayıdır. Niteliksiz bir char türünü kullanırsanız ve bir metin char[] dizisi olarak modellenirse, birçok C derleyicisi varsayılan olarak unsigned.

+0

"b [0: 1], uzunluk 1'in bir bayt nesnesi olacaktır. (Bu, hem dizinlemenin hem de dilimlemenin, uzunluk 1'in bir dizesini oluşturacağı metin dizgileriyle çelişir)" bu cümleyi açıklamama izin verir misiniz? " ? – CY5

+0

@ CY5: üzgünüm, hangi kısmı aldın?Bir (Unicode) dizesi oluşturursanız, ''abc' [0] '',' a 'adlı başka bir dize nesnesi üretir. Eğer 'bytes' nesnesi için kullanılan örnekle aynı dilimi kullanırsanız, '' abc '[0: 1] 'ayrıca bir uzunluğa sahip bir string nesnesi üretir,' 'a''. –

+0

@ CY5: "bytes" nesnesinde, "b'abc" [0] 'bir tamsayı (' 97') üretir ve dilimleme, bir 'bytes' nesnesinin bir uzunluğunu (bb'abc '[0: 1] '' b'a'' üretir. –

İlgili konular