Python 3.x , türler arasında net bir ayrım yapar:
str
= '...'
değişmez değerler = bir Unicode karakter dizisi (Python'un nasıl derlendiğine bağlı olarak UTF-16 veya UTF-32)
bytes
= b'...'
değişmez değerler = bir sekizli dizisi (0 ile 255 arasında tamsayılar)
Java veya C # ile konum tanıdık Eğer varsa, aklınıza str
olarak String
ve bytes
sıra byte[]
. Eğer SQL ile bilginiz varsa, düşünmek str
kadar NVARCHAR
ve bytes
şekilde BINARY
ya BLOB
. Windows kayıt defteri hakkında bilginiz varsa, düşünmek str
kadar REG_SZ
ve bytes
şekilde REG_BINARY
. C (++) hakkında bilginiz varsa, öğrendiğiniz her şeyi char
ve dizeleri unutun , çünkü KARAKTER BİR BYTE DEĞİLDİR . Bu fikir çok eski.
Sen kullanmak str
Metni temsil etmek istediğinizde.
print('שלום עולם')
Sen kullanmak bytes
Eğer yapılar gibi düşük seviyeli ikili veri temsil etmek istediğinizde.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Sen edebilirsiniz kodlamak bir str
a bytes
nesne.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
Ve eğer bir deşifre edebilir bytes
bir içine str
.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Ancak iki türü serbestçe karıştıramazsınız.
>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str
b'...'
Notasyonu biraz o ASCII karakterleri yerine onaltılık numaraları ile belirtilmesi 0x01-0x7F bayt izin vermesidir karıştırıyor.
>>> b'A' == b'\x41'
True
Ama vurgulamalıyım ki, karakter bir bayt değildir .
>>> 'A' == b'A'
False
Python 2.x'te
Python'un 3.0 öncesi sürümlerinde metin ve ikili veriler arasında bu tür bir ayrım yoktu. Bunun yerine:
unicode
= u'...'
değişmez değerler = Unicode karakter dizisi = 3.xstr
str
= '...'
değişmez değerler = şaşkın bayt / karakter dizileri
- Genellikle metin, bazı belirtilmemiş kodlamalarda kodlanır.
- Ancak
struct.pack
çıktı gibi ikili verileri temsil etmek için de kullanılır .
2.x-3.x geçişini kolaylaştırmak için, b'...'
ikili dizelerin ( bytes
3.x içinde olması gerekir ) metin dizelerinden ( str
3'te olması gerekir) ayırt edilmesini sağlamak için değişmez sözdizimi Python 2.6'ya geri bildirildi . .x). b
Önek 2.x hiçbir şey yapmaz, ama söyler 2to3
3.x Unicode dizeye dönüştürmek için değil senaryoyu
Yani evet, b'...'
Python'daki değişmez değerler PHP ile aynı amaca sahiptir.
Ayrıca, meraktan, diğer şeyleri yapan b ve u'dan daha fazla sembol var mı?
Ön r
ek, ham dize oluşturur (örneğin, sekme yerine r'\t'
ters eğik çizgi + 'dır t
) ve üç tırnak işareti verir '''...'''
veya """..."""
çok satırlı dize değişmez değerlerine izin verir.