Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: immutable objects, memory management, Python internals, reference counting

Как работает память в Python при работе с неизменяемыми объектами?

Вопрос проверяет понимание механизма работы с неизменяемыми объектами в Python, что важно для предотвращения ошибок, связанных с неожиданным поведением при присваивании и передаче аргументов.

Короткий ответ

В Python неизменяемые объекты, такие как целые числа, строки или кортежи, при создании занимают фиксированное место в памяти. При присваивании переменной такого объекта, переменная получает ссылку на этот участок памяти. Если вы пытаетесь изменить неизменяемый объект (например, a += 1 для числа), Python создаёт новый объект в памяти и перенаправляет ссылку переменной на него. Это важно, потому что несколько переменных могут ссылаться на один и тот же неизменяемый объект, и изменение через одну из них не затронет другие, так как создаётся новый объект.

Длинный ответ

В Python память управляется с помощью механизма подсчёта ссылок и сборщика мусора. Неизменяемые объекты (immutable) — это объекты, состояние которых нельзя изменить после создания. К ним относятся, например, целые числа (int), числа с плавающей точкой (float), строки (str), кортежи (tuple) и frozenset.

Как работает присваивание и ссылки

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

a = 10
b = 10
print(a is b)  # True, потому что Python может кэшировать маленькие целые числа
print(id(a) == id(b))  # True, тот же идентификатор в памяти

x = "hello"
y = "hello"
print(x is y)  # Часто True из-за интернирования строк

Что происходит при "изменении"

Поскольку объект неизменяем, любая операция, которая кажется изменяющей его, на самом деле создаёт новый объект. Переменная затем начинает ссылаться на этот новый объект.

a = 5
print(id(a))  # Допустим, 140736123456789

a = a + 2  # Попытка "изменить" a
print(id(a))  # Новый идентификатор, потому что создан новый объект int(7)

# С кортежами:
t = (1, 2, 3)
t = t + (4,)  # Создаётся новый кортеж, старый остаётся неизменным
print(t)  # (1, 2, 3, 4)

Практическое применение и последствия

Это поведение влияет на несколько аспектов:

  • Передача аргументов в функции: При передаче неизменяемого объекта в функцию, внутри функции создаётся локальная ссылка на тот же объект. Если вы попытаетесь изменить его, создастся новый объект, и исходный объект снаружи функции останется неизменным. Это иногда называют "передачей по значению ссылки".
  • Эффективность памяти: Python может кэшировать и повторно использовать некоторые неизменяемые объекты (например, маленькие целые числа от -5 до 256 или короткие строки через интернирование), чтобы сэкономить память.
  • Безопасность: Неизменяемые объекты безопасно использовать как ключи словаря или элементы множества, так как их хэш-значение не меняется.
def try_to_change(num, text):
    num += 10
    text = text.upper()  # Создаётся новая строка
    print("Inside:", num, text)

original_num = 5
original_text = "hi"
try_to_change(original_num, original_text)
print("Outside:", original_num, original_text)  # Остались 5 и "hi"

Вывод: Понимание работы памяти с неизменяемыми объектами помогает писать более предсказуемый код, избегать скрытых ошибок и эффективнее использовать ресурсы. Это знание особенно важно при работе с многопоточностью (где неизменяемые объекты по умолчанию потокобезопасны) и при оптимизации производительности приложений.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    3

  • Сложность:

    4

Навыки

  • Python

    Python

Ключевые слова

#immutable objects

#memory management

#Python internals

#reference counting

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.