ViktorS88
@ViktorS88
Женат, спорт, саморазвитие...

Как хранятся числа в python?

Познакомился с ASCII и с utf-8 и unicode, но у меня осталось два момента которые никак не могу понять... вроде уже и перечитал много статей по этой теме. Везде говорится о том как хранятся символы в памяти, но нигде не говорится как хранятся в памяти целые или вещественные числа?

И второе, никак не пойму, если я работаю в интерпретаторе pycharm, то в какой кодировке мне выдают там символы? Просто русские буквы весят два байта в utf-8, но когда я запрашиваю len('ж') мне выдает один байт(так в какой кодировке мне выдает символы и строку???), возможно я что то не догоняю...
Сразу поставлю отметку о полученном ответе, если ответ будет дан на мой вопрос! Спасибо...
  • Вопрос задан
  • 526 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Как уже заметил Roman Kitaev, функция len() возвращает количество элементов в контейнере, в вашем случае символов в строке, а не количество байт занимаемых контейнером в памяти. Чтобы получить размер в байтах можно воспользоваться функцией getsizeof() модуля sys. И тут вас ждёт сюрприз

In [1]: import sys

In [2]: sys.getsizeof('ж')
Out[2]: 76

Символ 'ж' занимает не один байт и не два, а 76. Объясняется это тем, что в Python абсолютно всё - объекты. В данном случае 76 байт занимает объект строки, состоящий из одного символа. На уровне виртуальной машины объекты - это обычные Сишные структуры, содержащие данные и ряд служебных полей. В частности строка выглядит как-то так:
typedef struct {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;

    long ob_shash;
    int ob_sstate;
    char ob_sval[1];
} PyStringObject;

а целое число так
typedef struct {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;

    long ob_digit[1];
} PyLongObject;

Тема управления памятью в Python очень глубокая, но как верно заметил sim3x, может запутать новичка.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@deliro
Лучше, чем это, никто не скажет

https://github.com/python/cpython/blob/master/Obje...

len("ж") показывает длину строки (количество символов), а не то, сколько памяти она занимает в байтах.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы