Литерал — это запись конкретного значения прямо в исходном коде: число 42, строка "Привет", логическое True. Компилятор или интерпретатор берет значение буквально, как оно написано, без обращения к имени. В этой статье разберем, чем литерал отличается от переменной и константы, и пройдем по всем видам литералов: числовым, строковым, логическим, null, символьным и литералам коллекций. Основные примеры — на Python 3.14, рядом — параллели в Java, C, C++ и JavaScript.
Содержание
Литерал, переменная и константа — разные вещи
Эти три понятия легко путают, поэтому разведем их сразу на одной цепочке:
- литерал — само значение в тексте программы (
42), у него нет имени; - переменная — именованная ячейка, в которую значение положили и которое можно заменить (
age = 42, потомage = 43); - константа — именованное значение, которое по договоренности не переприсваивают (
MAX_AGE = 100).
age = 42 # 42 - литерал, age - переменная
age = 43 # переменную можно переприсвоить
MAX_AGE = 100 # константа по соглашению (имя капсом)
print(age, MAX_AGE)
43 100
Важная оговорка: в Python нет ключевого слова для настоящей константы. Договоренность — писать имя капсом (MAX_AGE), а строгую пометку typing.Final проверяет только статический анализатор (например, mypy), но не сам интерпретатор в момент запуска. То есть MAX_AGE = 100; MAX_AGE = 200 в Python выполнится без ошибки. Для сравнения: в Java final int MAX = 100; и в C++ const int MAX = 100; запрещают переприсваивание уже на этапе компиляции. Литерал же в любом языке нельзя изменить в принципе: значение 42 не превратится в 43, меняется только то, что в переменной.
Виды литералов: сводная таблица
Ниже — карта основных видов литералов с формой записи в Python и параллелями. Дальше каждый вид разберем на рабочем коде.
| Вид литерала | Запись в Python | В других языках | Пример |
|---|---|---|---|
| Целочисленный | 255, 0xFF, 0o377, 0b1111_1111 |
Java/C/C++/JS: 0xFF, 0b... |
0xFF = 255 |
| Вещественный | 3.14, 2.5e-3 |
так же в Java, C, JS | 2.5e-3 = 0.0025 |
| Комплексный | 3 + 4j |
нет в Java/C (есть в C99 через тип) | 3+4j |
| Строковый | "текст", 'текст' |
двойные кавычки везде | "Привет" |
| Сырой (raw) | r"C:\new" |
C#: @"...", JS: String.raw |
r"\n" |
| Многострочный | """...""" |
JS: обратные кавычки | тройные кавычки |
| Шаблонный | f"{name}" |
JS: `${name}`, C#: $"{name}" |
интерполяция |
| Логический | True, False |
true, false |
True |
| Пустой | None |
null, C++: nullptr |
None |
| Символьный | нет (строка длины 1) | Java/C/C++: 'A' |
'A' |
| Коллекций | [1,2], (1,2), {"a":1}, {1,2} |
JS: [], {} |
[1, 2, 3] |
Числовые литералы
Числовые литералы бывают целыми, вещественными и (в части языков) комплексными. Начнем с целых. Одно и то же число записывается в разных системах счисления через префиксы, но значение от этого не меняется — меняется только форма записи:
decimal = 255
hexad = 0xFF # 16-ричная, префикс 0x
octal = 0o377 # 8-ричная, префикс 0o
binary = 0b1111_1111 # 2-ичная, префикс 0b
print(decimal, hexad, octal, binary)
255 255 255 255
Все четыре литерала — это число 255, просто записанное четырьмя способами. Подчеркивания _ внутри числа — разделители разрядов для читаемости (0b1111_1111); на значение они не влияют и поддерживаются в Python с версии 3.6. Похожий прием есть и в других языках, но синтаксис разный: в Java и Python это 1_000_000, в C++14 — апостроф 1'000'000, в JavaScript (с ES2021) — тоже 1_000_000.
Частая ошибка — вписать в запись цифру, недопустимую для этой системы счисления:
value = 0b1012 # цифры 2 в двоичной записи быть не может
SyntaxError: invalid digit '2' in binary literal
Исправляем — в двоичной записи только нули и единицы:
value = 0b1011 # это 11 в десятичной
print(value) # 11
11
Вещественные (с плавающей точкой) литералы записывают через точку или в научной форме с суффиксом e:
pi = 3.14
tiny = 2.5e-3 # 2.5 * 10^-3 = 0.0025
big = 1_000_000.0
print(pi, tiny, big)
3.14 0.0025 1000000.0
В Python есть еще комплексные литералы — с суффиксом j для мнимой части. В Java и C такого литерала на уровне языка нет (в C99 комплексные числа задаются через тип и заголовок <complex.h>, а не отдельным литералом):
z = 3 + 4j
print(z, abs(z)) # модуль = 5.0
(3+4j) 5.0
Строковые литералы
Строковый литерал — это набор символов в кавычках. В Python двойные и одинарные кавычки равнозначны, что удобно, когда внутри строки нужны кавычки другого вида. Служебные символы задают escape-последовательностями через обратный слеш (\n — перенос строки, \t — табуляция, \" — кавычка внутри строки):
plain = "Привет"
quoted = 'Он сказал "да"' # двойные внутри одинарных
escaped = "строка\nс переносом"
print(quoted)
print(escaped)
Он сказал "да"
строка
с переносом
Когда обратный слеш нужен как обычный символ (пути Windows, регулярные выражения), удобны сырые (raw) литералы с префиксом r: в них \ не запускает экранирование. Многострочный текст в Python задают тройными кавычками:
raw = r"C:\new\test" # слеши остаются как есть
multiline = """первая строка
вторая строка"""
print(raw)
print(multiline)
C:\new\test
первая строка
вторая строка
Отдельный вид — шаблонные (интерполируемые) литералы. В Python это f-строки (с версии 3.6): выражение в фигурных скобках вычисляется и подставляется в строку. В JavaScript аналог — шаблонные литералы в обратных кавычках с ${...}, в C# — $"{...}":
name = "Python"
templated = f"Язык {name}, длина имени {len(name)}"
print(templated)
Язык Python, длина имени 6
Аналог в JavaScript выглядит так:
const name = "JS";
console.log(`Язык ${name}`); // Язык JS
Логические литералы и null
Логический литерал принимает одно из двух значений. В Python это True и False (с заглавной буквы), в Java, C++ и JavaScript — true и false со строчной. Отдельный литерал None в Python (аналог null в Java, JavaScript и C#, nullptr в C++) обозначает отсутствие значения — ссылку, которая ни на что не указывает:
flag = True
empty = None
print(flag, empty is None) # None сверяют через is, не через ==
True True
Здесь важна граница: None — это не то же самое, что 0, пустая строка "" или пустой список []. Все они дают ложь в условии if, но None означает именно «значения нет», а 0 — это конкретное число ноль. Проверять на None принято через is, а не через ==.
Символьные литералы
Символьный литерал — это одиночный символ в одинарных кавычках, например 'A'. Здесь языки расходятся принципиально. В Java, C и C++ символ — отдельный тип: в Java char занимает 16 бит (кодовая единица UTF-16), в C — как правило 1 байт. В Python отдельного символьного типа нет вообще: 'A' — это просто строка длины 1, и одинарные кавычки равнозначны двойным.
// Java: символьный литерал - отдельный тип
char letter = 'A';
int code = letter; // 65 - код символа
# Python: 'A' - это строка длины 1, не отдельный тип char
letter = 'A'
print(type(letter), ord(letter)) # <class 'str'> 65
<class 'str'> 65
Функция ord() в Python и приведение char к int в Java дают код символа — в примере это 65 для латинской A.
Литералы коллекций
Многие языки позволяют записать целую структуру данных литералом, не вызывая конструктор. В Python это списки, кортежи, словари и множества:
nums = [1, 2, 3] # список (list)
point = (10, 20) # кортеж (tuple)
user = {"name": "Ann", "age": 25} # словарь (dict)
unique = {1, 2, 2, 3} # множество (set), дубли уходят
print(nums, point, user, unique)
[1, 2, 3] (10, 20) {'name': 'Ann', 'age': 25} {1, 2, 3}
Множество из литерала {1, 2, 2, 3} автоматически убирает повтор и хранит {1, 2, 3}. В JavaScript литералами задают массивы [1, 2, 3] и объекты {name: "Ann"} — именно объектный литерал JS стал основой формата JSON. В Java прямого литерала для «объекта на лету», как в JavaScript, нет: массив можно записать литералом {1, 2, 3} при инициализации, а произвольный объект создают через конструктор.
Выводы
- Литерал — это конкретное значение, записанное прямо в коде; его нельзя изменить, в отличие от переменной, и у него нет имени, в отличие от константы.
- Числовые литералы делятся на целые (в разных системах счисления через
0x,0o,0b), вещественные (точка и научная формаe) и комплексные; разделитель_только улучшает читаемость. - Строковые литералы поддерживают экранирование, сырую форму (
r"..."), многострочность (тройные кавычки) и интерполяцию (f-строки в Python, шаблонные литералы в JS). - Логические (
True/False),None, символьные и литералы коллекций различаются по языкам: в Python нет отдельного типа char, аNoneне равно нулю или пустой строке. - Синтаксис литералов у языков близок, но не совпадает — префиксы систем счисления, разделители разрядов и интерполяция записываются по-разному.
Где применяется / связь с практикой
Литералы — первое, что набирает начинающий программист: любое значение в коде, от счетчика цикла до текста сообщения, начинается с литерала. Уверенное понимание видов литералов помогает не путать 0o17 и 17, читать чужой код с f-строками и raw-строками и не спотыкаться на разнице None, 0 и "". Дальше эти навыки складываются в работу с типами данных, коллекциями и форматами вроде JSON.
Освойте тему на практике
Системно разобрать синтаксис Python, включая все виды литералов, типы данных и структуры, можно на курсе Python Basic. Если хочется сначала посмотреть формат обучения и уровень задач, загляните на открытые уроки Otus — там разбирают темы вживую и отвечают на вопросы.
FAQ
Литерал и константа — это одно и то же?
Нет. Литерал — безымянное значение в коде (100), а константа — именованное значение, которое договорились не менять (MAX = 100). Константа хранит литерал, но у нее есть имя, а у литерала нет.
Почему 0xFF и 255 дают одно и то же число?
Это одно значение в разных системах счисления: 0xFF — шестнадцатеричная запись, 255 — десятичная. Префикс задает только форму записи в исходнике, в память попадает одинаковое целое.
В Python есть тип char для одного символа?
Нет, отдельного символьного типа в Python нет. Одиночный символ 'A' — это строка (str) длины 1. Отдельный тип char есть в Java, C и C++.



