Я пытаюсь понять строковое представление в python 3. Я видел различные объяснения на сайте и из книги, изучающей python Марка Лутца, что в python 3 объекты str хранятся в виде кодов Unicode. Цитируя книгу, "последовательности кода, отличные от Unicode, представляют собой последовательности из 8 бит байтов, которые, когда это возможно, печатаются с символами ASCII, а строки Unicode - это последовательности кодовых точек Unicode".
Я понимаю первую часть цитаты выше, но я не совсем понимаю вторую. Как последовательность символов, например, когда я набираю S = 'спам' в консоли, должна храниться как "Кодовые точки Unicode"?
Я считаю, что кодовые точки - это просто цифры, которые соответствуют символам, однако фактическая кодировка, которая выводит вас из этого числа в двоичное представление, зависит от используемой вами системы, такой как utf-8 или utf-32. Если это правда (пожалуйста, исправьте меня, если это не так!), То для того, чтобы моя переменная S была сохранена в памяти, компьютер должен в какой-то момент преобразовать "спам" в некоторую последовательность байтов. Итак, я перехожу от некоторых символов к двоичным, что является формой кодирования? Я видел еще одно сообщение, где объяснялось, что python не выполняет свою собственную кодировку.
Тогда я не понимаю, как моя переменная S может быть сохранена в памяти без прохождения какой-либо формы кодирования (а не только для хранения данных в виде кодовых точек, как объясняет книга)?
Заранее спасибо.
Ваша цитата ничего не говорит о представлении строки в Unicode в памяти. В нем говорится: "Строки Unicode - это последовательности кодовых точек Unicode", а не "хранятся как".
Эта цитата - это описание значения строки Unicode, а не ее представления в памяти. Python имеет множество способов представления строк Unicode внутри, включая ASCII, UTF-8 и UTF-32. Он может даже содержать несколько представлений, хранящихся в одном и том же строковом объекте; в частности, PyUnicode_AsUTF8AndSize приведет к тому, что строка сохранит вспомогательное представление UTF-8, если только строка не является ASCII (которая уже является допустимой UTF-8), и строка может также содержать представление wchar_t.
Все представления памяти представляют собой детали реализации и могут быть изменены. Если вы хотите увидеть внутреннее представление, взгляните на Include/unicodeobject.h
ord()
для любого символа Юникода. Память в основном содержит двоичное представление этого числа