Зарезервированные слова Python 3 — полный список и частые ошибки

Python 3 резервирует 35 слов, которые нельзя использовать как имена переменных, функций или классов. Попытка присвоить значение любому из них вызовет SyntaxError ещё до запуска программы. Эти слова формируют синтаксис языка: условия, циклы, обработку исключений, определение функций и классов. Знать их наизусть не обязательно — интерпретатор подскажет. Но понимать, почему код ломается из-за переменной class или list, нужно с первых дней.
Как получить список зарезервированных слов
Модуль keyword из стандартной библиотеки хранит актуальный список для текущей версии Python:
>>> import keyword
>>> print(keyword.kwlist)
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await',
'break', 'class', 'continue', 'def', 'del', 'elif', 'else',
'except', 'finally', 'for', 'from', 'global', 'if', 'import',
'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise',
'return', 'try', 'while', 'with', 'yield']
>>> len(keyword.kwlist)
35
Функция keyword.iskeyword() проверяет конкретное слово:
>>> keyword.iskeyword('for')
True
>>> keyword.iskeyword('list')
False
Слово list не зарезервировано — это встроенная функция. Разница между зарезервированными словами и встроенными именами принципиальна, и мы разберём её ниже.
Полная таблица 35 зарезервированных слов
Группа
Слова
Логические значения
False, True, None
Логические операторы
and, or, not
Условия
if, elif, else
Циклы
for, while, break, continue
Функции
def, return, lambda, yield
Классы
class
Импорт
import, from, as
Исключения
try, except, finally, raise, assert
Область видимости
global, nonlocal
Управление контекстом
with
Удаление
del
Проверка принадлежности
in, is
Асинхронность
async, await
Заглушка
pass
Все слова чувствительны к регистру. Три из них начинаются с заглавной буквы (False, None, True), остальные — строчные.
Группа: логические значения
False, True, None
False и True — единственные экземпляры типа bool. None — объект-одиночка, обозначающий отсутствие значения. Все три пишутся с заглавной буквы:
>>> True = 1
SyntaxError: cannot assign to True
>>> None = 'пусто'
SyntaxError: cannot assign to None
В Python 2 True и False не были зарезервированы — их можно было переопределить. В Python 3 это исправили.
Группа: логические операторы
and, or, not
Оператор and возвращает первый ложный операнд или последний, если все истинны. Оператор or возвращает первый истинный. Оператор not инвертирует значение:
>>> True and False → False
>>> 0 or 'default' → 'default'
>>> not [] → True
Частая ошибка — писать && или || вместо and/or. В Python нет символьных логических операторов. Выражение if x && y вызовет SyntaxError .
Группа: условия
if, elif, else
Управляют ветвлением. elif — сокращение от «else if», отдельного слова elseif в Python нет. Двоеточие после условия обязательно.
Ошибка новичков — писать else if раздельно. Код не сломается синтаксически (else начнёт новый блок, if — вложенное условие), но логика отступов нарушится.
Группа: циклы
for, while, break, continue
Цикл for перебирает элементы итерируемого объекта. Цикл while повторяется, пока условие истинно. Инструкция break прерывает ближайший цикл. Инструкция continue пропускает остаток текущей итерации:
for i in range(10):
if i == 5:
break
if i % 2 == 0:
continue
print(i)
# 1, 3
Оба цикла поддерживают блок else, который выполняется, если цикл завершился без break.
Группа: функции
def, return, lambda, yield
def объявляет функцию. return возвращает значение; без него функция возвращает None. lambda создаёт анонимную функцию с одним выражением. yield превращает функцию в генератор:
def square(x):
return x**2
double = lambda x: x * 2
def countdown(n):
while n > 0:
yield n
n -= 1
Группа: импорт
import, from, as
Инструкция import подключает модуль. Комбинация from ... import загружает конкретные имена. Слово as создаёт псевдоним:
import json
from datetime import datetime as dt
import numpy as np
Начинающие иногда путают порядок: пишут import datetime from .... Python 3.12 подсказывает правильный синтаксис прямо в тексте ошибки.
Группа: исключения
try, except, finally, raise, assert
Блок try/except перехватывает ошибки. finally выполняется всегда. raise бросает исключение вручную. assert проверяет условие и бросает AssertionError, если оно ложно:
try:
result = 10 / 0
except ZeroDivisionError:
result = None
finally:
print('Блок finally выполнен')
Ошибка — использовать assert для проверки пользовательского ввода. Ассерты отключаются флагом -O, и проверка просто исчезнет. Для валидации данных — условия с raise ValueError.
Группа: область видимости
global, nonlocal
global объявляет, что переменная внутри функции ссылается на глобальную. nonlocal связывает переменную с ближайшей внешней областью видимости — во вложенных функциях:
counter = 0
def increment():
global counter
counter += 1
Без global попытка изменить counter внутри функции вызовет UnboundLocalError. Python увидит присваивание и решит, что переменная локальная, но не найдёт её инициализацию.
Группа: асинхронность
async, await
Появились в Python 3.5. async перед def создаёт корутину. await приостанавливает выполнение до завершения асинхронной операции:
import asyncio
async def fetch_data():
await asyncio.sleep(1)
return {'status': 'ok'}
В Python 3.5–3.6 async и await были «мягкими» ключевыми словами. С Python 3.7 они стали полноценными зарезервированными словами.
Группа: остальные слова
- with — управление контекстом: открывает ресурс и гарантирует его закрытие (with open("f.txt") as f).
- del — удаляет ссылку на объект. Не уничтожает сам объект — только убирает имя.
- in — проверяет вхождение элемента в коллекцию ("a" in "abc").
- is — проверяет идентичность объектов (один объект в памяти, а не равенство значений).
- pass — пустая инструкция, нужна где синтаксис требует блок кода, а логика не реализована.
Зарезервированные слова vs. встроенные имена
Ключевое слово нельзя использовать как переменную — интерпретатор не допустит. Встроенное имя (list, int, print, len, type, str) использовать как переменную можно — Python не запретит . Но это затенит (shadow) встроенную функцию:
>>> list = [1, 2, 3]
>>> list(range(5))
TypeError: 'list' object is not callable
Переменная list «накрыла» встроенную функцию list() . Чтобы вернуть доступ, удаляют переменную через del list. Затенение — одна из самых частых ошибок у новичков, потому что Python не выдаёт предупреждения. Линтеры (flake8, pylint, ruff) ловят такие случаи.
Пять частых ошибок
1. Переменная с именем class, for, import
>>> class = 'бизнес'
SyntaxError: invalid syntax
Решение: class_, klass, cls, category — любое имя, не совпадающее с ключевым словом .
2. Символьные операторы вместо словесных
>>> if x && y:
SyntaxError: invalid syntax
В Python нет &&, || и !. Вместо них — and, or, not .
3. Затенение встроенных имён
>>> id = 42
>>> id('hello')
TypeError: 'int' object is not callable
Способ защиты: настроить линтер. Правило A003 в flake8-builtins и W0622 в pylint предупредят о затенении .
4. Путаница is и ==
>>> a = 1000
>>> b = 1000
>>> a is b
False # за пределами кеша — разные объекты
>>> a == b
True
CPython кеширует числа от -5 до 256. За пределами кеша is возвращает False даже при равных значениях. Для сравнения значений — только ==. Исключение: x is None.
5. assert в продакшн-коде
assert user.is_active, 'Пользователь неактивен'При запуске с python -O ассерт исчезнет. Вместо assert для валидации:
if not user.is_active:
raise PermissionError('Пользователь неактивен')
Как избежать конфликтов
- Называть переменные осмысленно: items вместо list, user_class вместо class, total вместо sum.
- Добавлять подчёркивание в конце, если конфликт неизбежен: type_, id_, input_. PEP 8 рекомендует именно такой стиль.
- Настроить линтер (ruff, flake8, pylint) — он предупредит о затенении встроенных имён.
- В IDE (PyCharm, VS Code) зарезервированные слова подсвечиваются другим цветом. Если имя переменной стало цветным — что-то пошло не так.
Менялся ли список от версии к версии
В Python 2 было 30 ключевых слов. Слово print было инструкцией, exec — тоже. В Python 3 оба стали встроенными функциями и покинули список. Слова async и await добавили в Python 3.5, а с 3.7 они стали полноценными зарезервированными. С тех пор список стабилен: 35 слов.
В Python 3.10 появился оператор match/case, но match и case — «мягкие» ключевые слова (soft keywords). Они зарезервированы только внутри конструкции match и не входят в keyword.kwlist. Переменную match = 5 создать можно:
>>> keyword.iskeyword('match')
False
>>> keyword.softkwlist # Python 3.12+
['_', 'case', 'match', 'type']
FAQ
Сколько зарезервированных слов в Python 3?
35 слов. Полный список доступен через keyword.kwlist.
Можно ли использовать list, str, int как имена переменных?
Технически да — они не зарезервированы. Но это затенит встроенные функции и вызовет ошибки позже в коде .
Что такое soft keywords?
Слова, зарезервированные только в определённом контексте. В Python 3.10+ это match, case, type и _. За пределами конструкции match/case их можно использовать как обычные имена.
Как быстро проверить, зарезервировано ли слово?
keyword.iskeyword("слово") вернёт True или False. Для мягких ключевых слов — keyword.softkwlist (с Python 3.12).
