← Назад к вопросам

Что такое ячейка памяти?

2.7 Senior🔥 101 комментариев
#FastAPI и Flask#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ячейка памяти

Ячейка памяти — это минимальная адресуемая единица в оперативной памяти компьютера, которая может хранить данные. Обычно размер одной ячейки составляет 1 байт (8 бит), хотя в некоторых архитектурах может быть иным.

Основные характеристики

  1. Адрес — уникальный номер, который идентифицирует ячейку памяти в системе
  2. Содержимое — данные, хранящиеся в ячейке (0-255 для одного байта)
  3. Размер — обычно 1 байт = 8 бит
  4. Время доступа — скорость чтения/записи данных

Память и адреса

Оперативная память можно представить как массив ячеек с номерами:

Адрес    | Содержимое (в байтах)
---------|--------------------
0x00001  | 65 (буква 'A')
0x00002  | 66 (буква 'B')
0x00003  | 67 (буква 'C')
0x00004  | 00 (нулевой байт)
0x00005  | 255

Каждой ячейке назначен адрес (обычно в шестнадцатеричном формате), и процессор обращается к памяти по этим адресам.

Как это работает в Python

В Python работа с памятью скрыта от программиста, но понимать механизм полезно:

# Создаём переменную
x = 42

# Узнаём адрес в памяти (id возвращает адрес объекта)
print(f"Адрес переменной x: {id(x)}")  # Например: 140734876532960

# При присваивании переменная указывает на ячейку памяти
y = x  # y указывает на ТУ ЖЕ ячейку памяти, что и x
print(id(x) == id(y))  # True

# При изменении создаётся новая ячейка
x = 43
print(id(x))  # Новый адрес!
print(id(y))  # Адрес 42 остался прежним

Типы памяти

1. Статическая память (Stack)

Хранит локальные переменные, параметры функций. Автоматически освобождается при выходе из функции:

def my_function():
    x = 10  # Выделяется в stack
    y = 20  # Выделяется в stack
    return x + y
    # Память для x и y освобождается здесь

result = my_function()
print(f"x больше не существует")

2. Динамическая память (Heap)

Хранит объекты, списки, словари. Освобождается сборщиком мусора:

# Эти объекты хранятся в heap
my_list = [1, 2, 3]  # Список в heap
my_dict = {"key": "value"}  # Словарь в heap
my_string = "Hello"  # Строка в heap

# После удаления ссылки Python автоматически освобождает память
del my_list  # Память освобождена (если нет других ссылок)

Ссылки на памяти (Pointers / References)

В Python нет явных указателей, но переменные хранят ссылки на объекты в памяти:

# Создаём список (объект в памяти)
original = [1, 2, 3]

# Создаём новую переменную, которая указывает на ТОТЖЕ объект
copy_ref = original

# Они указывают на одну и ту же ячейку памяти
print(id(original) == id(copy_ref))  # True

# Изменение через одну переменную влияет на другую
copy_ref.append(4)
print(original)  # [1, 2, 3, 4]
print(copy_ref)  # [1, 2, 3, 4]

# Для истинной копии используем copy()
import copy
true_copy = copy.deepcopy(original)
print(id(original) == id(true_copy))  # False

true_copy.append(5)
print(original)  # [1, 2, 3, 4]
print(true_copy)  # [1, 2, 3, 4, 5]

Управление памятью в Python

Сборка мусора (Garbage Collection)

Python автоматически отслеживает ссылки на объекты и освобождает память, когда на объект больше нет ссылок:

import gc

class MyObject:
    def __init__(self, name):
        self.name = name
    
    def __del__(self):
        print(f"Объект {self.name} удалён из памяти")

# Создаём объект
obj = MyObject("Test")
print(f"Адрес объекта: {id(obj)}")
print(f"Количество ссылок: {sys.getrefcount(obj)}")

# Удаляем ссылку
del obj  # Печатает: Объект Test удалён из памяти

# Принудительно запустить сборку мусора
gc.collect()

Размеры объектов

Каждый объект занимает определённое количество памяти:

import sys

# Узнаём размер в байтах
print(f"Размер int: {sys.getsizeof(42)} байт")
print(f"Размер str: {sys.getsizeof('hello')} байт")
print(f"Размер list: {sys.getsizeof([1, 2, 3])} байт")

# Примеры
small_list = [1, 2, 3]  # ~56 байт
large_list = list(range(1000))  # ~9000+ байт

print(f"Маленький список: {sys.getsizeof(small_list)}")
print(f"Большой список: {sys.getsizeof(large_list)}")

Практические примеры

Утечка памяти (Memory Leak)

Если не удалять ссылки, объекты остаются в памяти:

# Плохо: утечка памяти
cache = []
for i in range(1000000):
    obj = {"id": i, "data": "x" * 1000}
    cache.append(obj)  # Объекты никогда не удаляются

# Хорошо: очищаем кэш
cache = []
for i in range(1000000):
    obj = {"id": i, "data": "x" * 1000}
    cache.append(obj)
    if len(cache) > 1000:
        cache.clear()  # Освобождаем память

Передача по ссылке

def modify_list(lst):
    lst.append(4)  # Модифицирует оригинальный список

def modify_number(n):
    n = n + 1  # Не модифицирует оригинал

my_list = [1, 2, 3]
modify_list(my_list)
print(my_list)  # [1, 2, 3, 4]

my_number = 10
modify_number(my_number)
print(my_number)  # 10 (не изменилось)

Оптимизация памяти

  1. Используй __slots__ для экономии памяти в классах
  2. Удаляй большие объекты явно через del
  3. Используй генераторы вместо списков для больших данных
  4. Профилируй память с помощью memory_profiler
# С __slots__ объект занимает меньше памяти
class Point:
    __slots__ = ['x', 'y']
    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(1, 2)
print(sys.getsizeof(p))  # Меньше, чем без __slots__

Резюме

Ячейка памяти — это физическое хранилище данных. В Python программист не работает напрямую с адресами (как в C/C++), но понимание принципов управления памятью, ссылок и сборки мусора критически важно для написания эффективного и безошибочного кода.

Что такое ячейка памяти? | PrepBro