💻
Разработка в IT
Опубликовано:
15.04.2026
Обновлено:
14.04.2026

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

Читайте также