Может ли строка иметь нестандартную длину?
Что проверяют
Вопрос с подвохом в формулировке: интервьюер хочет услышать, что «длина строки» зависит от того, в чём её мерить, и что фиксированная длина встречается в данных чаще, чем кажется. Следом обычно спрашивают, почему после загрузки строки обрезались, а len() показывает не то, что видно глазами.
Как отвечать
Да, и дело не только в переменной длине. Разберите три уровня.
Единицы измерения. У одной и той же строки разная длина в байтах, кодовых точках и видимых символах:
- байты: в UTF-8 кириллица занимает 2 байта, большинство эмодзи 4. В Go
len("привет")вернёт 12, число символов даётutf8.RuneCountInString; - кодовые точки: их считает
len()в Python. Буква «é» бывает одной точкой или двумя (буква плюс комбинируемый знак), поэтому перед сравнением нормализуйте строки черезunicodedata.normalize("NFC", s); - графемы: эмодзи «семья» это пять кодовых точек, склеенных
ZWJ, а на экране один символ.
Хранение. Тип задаёт, фиксирована длина или нет:
- SQL:
CHAR(n)дополняет значение пробелами до n,VARCHAR(n)ограничивает сверху. В PostgreSQL n считается в символах, аtextиvarcharбез n практически не ограничены; - NumPy:
dtype='<U10'это строка фиксированной ширины, и более длинное значение при записи молча обрезается. В NumPy 2 появилсяStringDTypeпеременной длины; - pandas и Parquet: строки переменной длины, но держать их лучше в dtype
string(в том числе на PyArrow), а не вobject: меньше памяти, быстрее методы.str.
Модели. Для нейросети длина измеряется в токенах, и последовательности разной длины выравнивают: padding, truncation=True, max_length в токенизаторе плюс attention_mask, чтобы модель не училась на заполнителях.
Где спотыкаются
Считают длину в символах, когда лимит у поля или формата задан в байтах, и загрузка падает на кириллице или эмодзи.
Не замечают тихого обрезания в NumPy или при явном приведении к varchar(n) в PostgreSQL, как и пробелов-заполнителей у CHAR(n), а потом ищут, почему не сходится join по ключу.
Режут тексты по символам вместо токенов и теряют хвост документа при инференсе, не зная, сколько токенов на самом деле ушло в модель.