Программирование — это не только стройные строки кода и красивые алгоритмы. Иногда это ещё и бессонные ночи в поисках одного пропущенного символа. Представляем вашему вниманию новую рубрику: «Python: подводные камни и грабли».
В этой рубрике мы разбираем четыре типа ситуаций, с которыми сталкиваются все питонисты: человеческие ошибки, реальные проблемы из жизни, неочевидное поведение языка и забавные курьёзы. Сегодня — первый выпуск. Всех рад видеть тут. Начинаем!
🔴 Ошибка: забытое двоеточие
С этой ошибки начинают почти все. Вы пишете первую условную конструкцию, чувствуете себя уверенно, запускаете код… и получаете SyntaxError.
Глаза пробегают по строкам — всё выглядит идеально. Ошибка не бросается в глаза, потому что она крошечная: не хватает двоеточия в конце заголовка.
Python требует двоеточие после всех заголовков блоков: if, else, elif, for, while, def, class. Оно говорит интерпретатору: «Всё, заголовок закончился, дальше пойдёт тело блока».
Если видите SyntaxError на ровном месте — проверьте предыдущую строку. С вероятностью 99% там не хватает двоеточия.
🔵 Реальная проблема: как установить Python и не устроить бардак
Теперь перейдём от теории к суровой реальности. Одна из самых частых проблем, с которой новички приходят на форумы: «Я установил Python, но ничего не работает».
Где начинается проблема
Типичный сценарий. Человек вбивает в поиск «скачать Python», попадает на официальный сайт python.org, скачивает установщик, запускает его и жмёт «Далее → Далее → Готово». Казалось бы, всё правильно.
Потом открывает терминал, вводит python — и попадает в Microsoft Store. Или вводит pip install requests, а в ответ: 'pip' is not recognized as an internal or external command.
Корень зла — одна-единственная галочка, которую новичок не поставил при установке: «Add Python to PATH».
Что такое PATH и почему он важен
PATH — это переменная окружения, которая говорит операционной системе, в каких папках искать исполняемые файлы. Когда вы вводите в терминале python, система пробегает по всем папкам, перечисленным в PATH, и ищет там python.exe. Если папка с Python не добавлена, система его просто не видит.
Как надо было поступить
- Качаем Python только с python.org.
- При установке ставим ✅ «Add Python to PATH».
- Проверяем: python --version и pip --version в терминале.
Что делать, если Python уже установлен, а PATH не настроен
Переустанавливать не обязательно. Добавляем путь вручную (Windows):
- Нажмите Win + R, введите sysdm.cpl, нажмите Enter. Самый лёгкий путь — открывается окно «Свойства системы». Можно то же самое найти, нажав правую кнопку на «Мой компьютер» в проводнике и зайдя в «Дополнительные параметры системы», или через меню «Пуск» → «Настройки» → «Система» → «О системе» и снова «Дополнительные параметры системы». Это для тех, кому нравится щёлкать мышью. Только от системы к системе пути могут меняться, а sysdm.cpl всегда укажет верную дорогу.
- Вкладка «Дополнительно» → «Переменные среды».
- Находим Path → «Изменить».
- Нажмите «Создать» и добавьте два пути (замените YourUsername на имя пользователя, а Python313 на вашу версию):
C:\Users\YourUsername\AppData\Local\Programs\Python\Python313
C:\Users\YourUsername\AppData\Local\Programs\Python\Python313\Scripts
Если вы решили установить Python в другую папку, укажите путь до неё. Например:
C:\Python\Python313
C:\Python\Python313\Scripts
5. Нажмите ОК везде и перезапустите терминал.
Проверьте: python --version и pip --version должны заработать. На Mac и Linux Python обычно сам прописывается в PATH, но если нет — путь можно добавить через ~/.bashrc или ~/.zshrc.
Как избежать бардака в будущем
Используйте виртуальные окружения. Для каждого проекта — своё:
И все библиотеки проекта живут внутри, не мешая друг другу. Про виртуальные окружения я поговорю в будущем — не паникуйте, если пока не совсем поняли, о чём речь. А если нужно иметь на компьютере несколько версий самого Python (например, 3.9 и 3.13), есть инструмент pyenv — он позволяет устанавливать разные версии Python параллельно и переключаться между ними одной командой.
🟡 Неочевидное: изменяемый аргумент по умолчанию
С установкой разобрались. Теперь перейдём к тому, что поджидает вас уже в коде. Это, пожалуй, самая знаменитая грабля Python.
Посмотрите на этот код:
Добавляем функции print() чтобы вывести результат на экран (о функции print тоже будем отдельно говорить):
Логика новичка: «Я вызываю функцию, она добавляет элемент в список. Если список не передан, создаётся новый пустой». Поэтому для первого принта мы ждем получить [1], а для второго [2], потому что в обоих случаях мы не передали в качестве аргумента списка (my_list). Звучит разумно.
Смотрим на терминал и удивляемся:
Почему так происходит
В Python аргументы по умолчанию вычисляются один раз — в момент определения функции, а не при каждом её вызове. Объект [] создаётся один раз, и все вызовы, которые не передают свой список, работают с одним и тем же объектом в памяти.
Функция add_item(1) добавила 1 в этот список. Функция add_item(2) добавила 2 в тот же самый список. Отсюда и результат [1, 2].
Как правильно:
При каждом вызове проверяется: если аргумент не передан — создаётся новый пустой список. Никаких сюрпризов.
Правило: не используйте изменяемые объекты как аргументы по умолчанию. Используйте None и создавайте новый объект внутри функции.
🟢 Забавное: оператор is и неожиданное поведение объектов
А теперь — небольшой код, который может удивить даже тех, кто уже немного пишет на Python:
Первым аргументом к функции print() мы писали подсказки («Number» и
«List»), чтобы понимать какой вывод откуда получаем. Внимание на терминал:
Что здесь происходит
В Python есть два способа сравнения:
- == сравнивает значения (равны ли объекты по содержанию).
- is сравнивает объекты в памяти (это один и тот же объект или разные).
Python оптимизирует работу с неизменяемыми (immutable) объектами — числами, строками, кортежами. Если вы создаёте две переменные с одинаковым значением такого типа, интерпретатор часто не создаёт новый объект, а использует уже существующий. Поэтому is для них обычно возвращает True.
А изменяемые (mutable) объекты — списки, словари, множества — оптимизации не подлежат. Даже если два списка абсолютно одинаковы (оба пустые), Python создаст для каждого свой собственный объект в памяти. Поэтому is для них стабильно возвращает False.
Почему это важно знать: новичок может написать if my_list is []: и удивляться, что условие никогда не срабатывает. Или наоборот — проверить два числа через is, получить True и решить, что так можно сравнивать всё. Нельзя. Поведение is зависит от типа данных. Про оператор is я в дальнейших уроках планирую рассказать.
Вывод: для сравнения чисел, строк и любых других значений всегда используйте ==. Оператор is оставьте для сравнения с None (if x is None) и для проверки, что две переменные ссылаются на один и тот же объект. Тогда никаких сюрпризов не будет.
Камни и грабли не страшны, когда знаешь, где лежат. А ошибки случаются у всех — даже у профи. Главное: не опускать руки и делать выводы.
Предназначение этой рубрики — помочь вам в этом. До встречи в следующем выпуске 💡