Как уже заметил
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, может запутать новичка.