Практическая разница и смысл между обычной строкой и байтовой?
Подскажите новичку, желательно переводя с технического на русский:
Любая информация это двоичный код и только так хранится информация в памяти. В чём практический смысл существования байтовой строки в питоне? Вся информация итак байтовая, вопрос лишь в том, каким образом к ней подходить. Информация всё равно транслируется из двоичного кода, например, в шестнадцатиричные символы, в символы ASCII - например представление байтовой строки b'Hello World'
Точно также, двоичный код транслируется в обычную строку. Зачем это разделение?
Ответы (2 шт):
Зачем это разделение?
Это не разделение. Символы (буквы, цифры, скобки, ...) и байты — это просто 2 различные существа.
Лучше всего представить себе, что они настолько различные существа, что у них нет ничего общего и что между ними нет никаких связей — чтобы лучше понят разницу и преодолеть ложное представление, вытекающие из того, что:
Когда-то — очень давно — символы и байты были почти то же самое, буквы были только английские и кодировка «один символ, один байт».
Символы — это текстовые единицы, как буквы, цифры, запятая, точка, и т.д.
Они для нас, людей.
(Вообще не нужно знать, в каком виде их Питон сохраняет. Я знал, удивился и забыл.)Даже начинающий программист не имеет с этим проблем. Например, он хочет записать знакомую фразу «Hello, world!», но не на английском, т.e. не
print('Hello, world!')а на своем родном — по-русски, по-китайски или по-японски.
Просто наберет на своей национальной клавиатуре буквы для перевода этой фразы в свой родной язык, и все будет работать как часы:
print('Привет, мир!')Байты — это последовательности из (в общем) 8 битов.
(Каждый бит может быть только нулей или единицей.) Пример байта:01001101.
Значение байта можно также выразить как целое число в диапазоне 0 — 255Они для машин.
Нам их нужно применить только в специальных случаях, прежде всего для обмена информациями между машинами и/или между программами.
Как я уже написал, представите себе, что у символов и байтов нет ничего общего.
Как другой пример вы можете себе представить разницу между английским алфавитом и азбукой:
abcdefghijklmnоp...
абвгдеёжзийклмно...
Кажется, что что-то у них сходное, что-то подобное, но даже сходные буквы читаются по-разному.
Подобным образом, кажется, что «обычные» и байтовые строки почти то же самое:
print('Hello, world!')
Hello, world!
print(b'Hello, world!')
b'Hello, world!'
Но совпадение здесь только случайно, потому что в байтовых строках возможно отдельные байты задавать как ASCII символы (и Питон их тоже так соображает), но только когда они из диапазона 32 — 127.
Следующие примеры уже так гладко не работают:
print('Привет, мир!')
Привет, мир!
print(b'Привет, мир!')
SyntaxError: bytes can only contain ASCII literal characters.
print('C:\User')
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
print(b'C:\User')
b'C:\\User'
Аналогия: обычная строка — это устная речь, байтовая строка — это звуки. Запись звуков будет звучать всегда и для всех одинаково. Но смысл этих звуков будет зависеть от языка. Например, мы не сможем правильно интерпретировать последовательность звуков [лист] или [гифт], если не знаем, какой язык применить для "расшифровки" в смысл.
Так и с байтами. Если в файле записаны байты 11000000, то мы никак не узнаем, что именно записано в этой файле, пока не станет известно, какой это "язык". Это может быть буква "А" в кодировке Windows-1251, это может быть буква "ю" в кодировке KOI8-R, и это может быть просто число 192 в байтах.
А если мы захотим записать число 192 в файл в виде текста, т.е. как три символа 1, 9 и 2, то в файле уже окажется 001100010011100100110010 (если мы будем использовать 8-битную кодировку ASCII или какую-нибудь другую, которая базируется на ней).