Зарезервированные слова 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, 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).

.svg.webp)





