Добавил:
omninoy
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:ЛР-4 / lab4
.pydef 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() 