Добавить в корзинуПозвонить
Найти в Дзене

💡 Python: подводные камни и грабли. Выпуск 1 — двоеточия, списки-призраки и бардак с установкой

Программирование — это не только стройные строки кода и красивые алгоритмы. Иногда это ещё и бессонные ночи в поисках одного пропущенного символа. Представляем вашему вниманию новую рубрику: «Python: подводные камни и грабли».
В этой рубрике мы разбираем четыре типа ситуаций, с которыми сталкиваются все питонисты: человеческие ошибки, реальные проблемы из жизни, неочевидное поведение языка и

Программирование — это не только стройные строки кода и красивые алгоритмы. Иногда это ещё и бессонные ночи в поисках одного пропущенного символа. Представляем вашему вниманию новую рубрику: «Python: подводные камни и грабли».

В этой рубрике мы разбираем четыре типа ситуаций, с которыми сталкиваются все питонисты: человеческие ошибки, реальные проблемы из жизни, неочевидное поведение языка и забавные курьёзы. Сегодня — первый выпуск. Всех рад видеть тут. Начинаем!

🔴 Ошибка: забытое двоеточие

С этой ошибки начинают почти все. Вы пишете первую условную конструкцию, чувствуете себя уверенно, запускаете код… и получаете SyntaxError.

Глаза пробегают по строкам — всё выглядит идеально. Ошибка не бросается в глаза, потому что она крошечная: не хватает двоеточия в конце заголовка.

-2

Python требует двоеточие после всех заголовков блоков: if, else, elif, for, while, def, class. Оно говорит интерпретатору: «Всё, заголовок закончился, дальше пойдёт тело блока».

-3

Если видите 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 не добавлена, система его просто не видит.

Как надо было поступить

  1. Качаем Python только с python.org.
  2. При установке ставим ✅ «Add Python to PATH».
  3. Проверяем: python --version и pip --version в терминале.

Что делать, если Python уже установлен, а PATH не настроен

Переустанавливать не обязательно. Добавляем путь вручную (Windows):

  1. Нажмите Win + R, введите sysdm.cpl, нажмите Enter. Самый лёгкий путь — открывается окно «Свойства системы». Можно то же самое найти, нажав правую кнопку на «Мой компьютер» в проводнике и зайдя в «Дополнительные параметры системы», или через меню «Пуск» → «Настройки» → «Система» → «О системе» и снова «Дополнительные параметры системы». Это для тех, кому нравится щёлкать мышью. Только от системы к системе пути могут меняться, а sysdm.cpl всегда укажет верную дорогу.
  2. Вкладка «Дополнительно»«Переменные среды».
  3. Находим Path → «Изменить».
  4. Нажмите «Создать» и добавьте два пути (замените 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.

Как избежать бардака в будущем

Используйте виртуальные окружения. Для каждого проекта — своё:

-4

И все библиотеки проекта живут внутри, не мешая друг другу. Про виртуальные окружения я поговорю в будущем — не паникуйте, если пока не совсем поняли, о чём речь. А если нужно иметь на компьютере несколько версий самого Python (например, 3.9 и 3.13), есть инструмент pyenv — он позволяет устанавливать разные версии Python параллельно и переключаться между ними одной командой.

🟡 Неочевидное: изменяемый аргумент по умолчанию

С установкой разобрались. Теперь перейдём к тому, что поджидает вас уже в коде. Это, пожалуй, самая знаменитая грабля Python.

Посмотрите на этот код:

Обычный код Python. Выглядит безобидно. Но PyCharm уже не доволен.
Обычный код Python. Выглядит безобидно. Но PyCharm уже не доволен.

Добавляем функции print() чтобы вывести результат на экран (о функции print тоже будем отдельно говорить):

-6

Логика новичка: «Я вызываю функцию, она добавляет элемент в список. Если список не передан, создаётся новый пустой». Поэтому для первого принта мы ждем получить [1], а для второго [2], потому что в обоих случаях мы не передали в качестве аргумента списка (my_list). Звучит разумно.

Смотрим на терминал и удивляемся:

Ой, а мы ждали [2]
Ой, а мы ждали [2]

Почему так происходит

В Python аргументы по умолчанию вычисляются один раз — в момент определения функции, а не при каждом её вызове. Объект [] создаётся один раз, и все вызовы, которые не передают свой список, работают с одним и тем же объектом в памяти.

Функция add_item(1) добавила 1 в этот список. Функция add_item(2) добавила 2 в тот же самый список. Отсюда и результат [1, 2].

Как правильно:

-8

При каждом вызове проверяется: если аргумент не передан — создаётся новый пустой список. Никаких сюрпризов.

Правило: не используйте изменяемые объекты как аргументы по умолчанию. Используйте None и создавайте новый объект внутри функции.

🟢 Забавное: оператор is и неожиданное поведение объектов

А теперь — небольшой код, который может удивить даже тех, кто уже немного пишет на Python:

-9

Первым аргументом к функции print() мы писали подсказки («Number» и

«List»), чтобы понимать какой вывод откуда получаем. Внимание на терминал:

Вот это поворот!
Вот это поворот!

Что здесь происходит

В Python есть два способа сравнения:

  • == сравнивает значения (равны ли объекты по содержанию).
  • is сравнивает объекты в памяти (это один и тот же объект или разные).

Python оптимизирует работу с неизменяемыми (immutable) объектами — числами, строками, кортежами. Если вы создаёте две переменные с одинаковым значением такого типа, интерпретатор часто не создаёт новый объект, а использует уже существующий. Поэтому is для них обычно возвращает True.

А изменяемые (mutable) объекты — списки, словари, множества — оптимизации не подлежат. Даже если два списка абсолютно одинаковы (оба пустые), Python создаст для каждого свой собственный объект в памяти. Поэтому is для них стабильно возвращает False.

Почему это важно знать: новичок может написать if my_list is []: и удивляться, что условие никогда не срабатывает. Или наоборот — проверить два числа через is, получить True и решить, что так можно сравнивать всё. Нельзя. Поведение is зависит от типа данных. Про оператор is я в дальнейших уроках планирую рассказать.

-11

Вывод: для сравнения чисел, строк и любых других значений всегда используйте ==. Оператор is оставьте для сравнения с None (if x is None) и для проверки, что две переменные ссылаются на один и тот же объект. Тогда никаких сюрпризов не будет.

Камни и грабли не страшны, когда знаешь, где лежат. А ошибки случаются у всех — даже у профи. Главное: не опускать руки и делать выводы.

Предназначение этой рубрики — помочь вам в этом. До встречи в следующем выпуске 💡