Как работают os.environ и os.getenv в Python
@python_quizРазберем этот квиз
Короткий ответ: приведённый фрагмент кода выведет строку с двумя значениями — оба равны "1". Ниже объясню, почему так происходит, подробно разберу варианты ответов и покажу дополнительные примеры.
Код из квиза

Что происходит — пошагово
- os.environ — это отображение (mapping) переменных окружения процесса. В CPython это объект, реализующий словарный интерфейс, который отражает текущие переменные окружения.
- Строка os.environ['X'] = '1' устанавливает переменную окружения X в значение '1' в этом отображении.
- os.getenv('X') и os.environ.get('X', '2') читают одно и то же отображение os.environ. Если ключ присутствует, оба вернут его значение; если отсутствует, оба возвращают указанный дефолт (у os.getenv можно тоже передать дефолт, но в примере дефолт для os.getenv не задан).
- Поскольку мы только что присвоили X = '1', оба вызова вернут '1'.
Демонстрация вывода

Анализ вариантов ответа (кратко)
- "Выведет: 1 2" — неверно, потому что os.environ.get('X', '2') не вернёт '2' при наличии ключа X; он вернёт текущее значение '1'.
- "Выведет: None 2" — неверно. Первый вызов не вернёт None: переменная установлена и поэтому возвращается '1'. Второй тоже не вернёт '2' по той же причине.
- "Выведет: 1 1" — соответствует поведению: оба чтения обращаются к одному и тому же отображению переменных окружения, где X = '1'.
- "Выведет: 1 1 2" — неверно, вывод содержит только два значения из print, а не три.
Нюансы и дополнительные примеры
- Если переменная не установлена в os.environ, оба способа чтения могут вернуть дефолт:
`python
import os
print(os.getenv('NO_SUCH'), os.environ.get('NO_SUCH', 'fallback'))
# Выведет: None fallback
`
os.getenv без явного дефолта вернёт None, os.environ.get вернёт переданный дефолт.
- os.environ хранит только строки: при присвоении автоматически приводятся строки; если передать нестроковое значение, оно будет преобразовано или возникнет ошибка в зависимости от реализации.
- os.getenv по сути использует тот же источник данных, что и os.environ.get (в CPython os.getenv вызывает os.environ.get), поэтому их поведение согласовано.
Вывод
os.environ — единое отображение переменных окружения процесса. После присвоения переменной оба способа чтения (os.getenv и os.environ.get) вернут установленное значение, а дефолты применяются только если ключ отсутствует.