Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР-4 / lab4

.py
Скачиваний:
1
Добавлен:
25.05.2026
Размер:
6.26 Кб
Скачать
def task_2_1():  # объявляем функцию для демонстрации типизированных и нетипизированных указателей
    x = 42  # создаем целочисленный объект со значением 42
    y = x  # привязываем имя y к тому же объекту в памяти
    print(f"id(x)={id(x)}, id(y)={id(y)} | одинаковые? {x is y}")  # выводим адреса объектов и проверяем их тождество
    def show_ref(obj: object) -> int:  # объявляем вложенную функцию с аннотацией любого типа
        return id(obj)  # возвращаем адрес переданного в функцию объекта
    print(f"функция вернула адрес: {hex(show_ref(x))}\n")  # вызываем функцию и выводим адрес в шестнадцатеричном виде


def square(n): return n * n  # определяем функцию возведения числа в квадрат
def task_2_2():  # объявляем функцию для демонстрации указателей на данные и функции
    data_ref = [1, 2, 3]  # создаем список и привязываем к нему имя
    func_ref = square  # привязываем новое имя к объекту существующей функции
    print(f"data: {data_ref}")  # выводим содержимое списка на экран
    print(f"func result: {func_ref(5)}")  # вызываем функцию через ссылку с аргументом 5
    print(f"func addr: {hex(id(func_ref))}\n")  # выводим адрес объекта функции в шестнадцатеричном виде


def task_2_3():  # объявляем функцию для демонстрации разницы между именем и объектом
    a = [1, 2]  # создаем изменяемый список из двух элементов
    b = a  # привязываем второе имя к тому же списку в памяти
    b.append(3)  # добавляем третий элемент в общий изменяемый список
    print(f"a={a}, b={b} | Один объект? {a is b}")  # выводим списки и проверяем их тождество
    c = 10  # создаем неизменяемый целочисленный объект
    d = c  # привязываем второе имя к тому же числу в памяти
    d = 20  # перепривязываем имя d к новому числу 20
    print(f"c={c}, d={d} | Один объект? {c is d}\n")  # выводим значения и проверяем тождество объектов


from typing import Final  # импортируем подсказку типа для объявления констант
CONST_VAL: Final[int] = 100  # объявляем переменную с подсказкой о неизменяемости значения


def task_2_4():  # объявляем функцию для демонстрации аналога константных указателей
    t = (1, 2)  # создаем неизменяемый кортеж из двух элементов
    print(f"Tuple: {t}")  # выводим содержимое кортежа на экран
    try:  # начинаем блок обработки возможных ошибок времени выполнения
        t[0] = 3  # пытаемся изменить первый элемент кортежа
    except TypeError as e:  # ловим ошибку типа, возникающую при изменении
        print(f"Ошибка изменения: {e}")  # выводим текст возникшей ошибки на экран
    print(f"typing.Final работает только при статическом анализе (mypy)\n")  # поясняем работу подсказок типа


def task_2_5():  # объявляем функцию для демонстрации многоуровневых ссылок
    level1 = 99  # создаем целочисленный объект со значением 99
    level2 = [level1]  # создаем список, содержащий ссылку на число
    level3 = [level2]  # создаем список, содержащий ссылку на предыдущий список
    level4 = [level3]  # создаем третий уровень вложенности списков
    print(f"Доступ к значению: {level4[0][0][0]}")  # выводим значение через цепочку индексаций
    level3[0][0] = 77  # перепривязываем имя level1 к новому числу во вложенном списке
    print(f"level1 остался неизменным (int иммутабелен): {level1}\n")  # подтверждаем неизменяемость исходного объекта


def task_2_6():  # объявляем функцию для сравнения указателей и ссылок в модели python
    x = 10  # создаем целочисленный объект со значением 10
    y = x  # создаем второе имя, ссылающееся на тот же объект
    z = None  # создаем имя, ссылающееся на пустой объект-заглушку
    print(f"x id: {id(x)}, y id: {id(y)} | Совпадают? {x is y}")  # выводим адреса и проверяем тождество объектов
    print(f"None аналог nullptr: {z is None}")  # проверяем ссылку на отсутствие валидного объекта
    print(f"в Python нет ручного new/delete, утечки памяти предотвращает GC.\n")  # поясняем автоматическое управление памятью

task_2_1()
task_2_2()
task_2_3()
task_2_4()
task_2_5()
task_2_6()
Соседние файлы в папке ЛР-4