import load
>>> id(load)
2398895830496
И тут я понял, что ничего не знаю.. где можно прочитать про кеширование? По идее же объект должен удалится сборщиком мусора, и у нового объекта должен быть другой идентификатор.
наверное, импортированные модули сохраняются в памяти до завершения программы. при первом импорте модуль загрузился в память и ссылка на его функцию присвоилась переменное load, при удалении load удалилась ссылка на функцию из модуля, при втором импорте ссылка снова присвоилась
как доказательство: import time t_1 = time.time() import numpy t_2 = time.time() print(round(t_2 - t_1, 5)) # 0.17509 del numpy t_1 = time.time() import numpy t_2 = time.time() print(round(t_2 - t_1, 5)) # 0.0
и что тебя смущает? что два разных объекта в разные моменты времени получили один и тот же id?
повторный импорт (без reload) просто достанет модуль из sys.modules
не наверное, а так и есть.
Да, почему так?
https://t.me/ru_python/1491830
Ссылки на уже загруженные модули хранятся в словаре sys.modules. Когда выполняется инстркция импорта в питоне, вначале проверяется словарь sys.modules на наличие этого модуля, если его там нет тогда загружается модуль при помощи механизма импорта.
Раньше воспринимал объект типа "module" как неизменяемый. Поэтому думал, что при reload создается новый объект этого типа, вот и смутило. Спасибо
1. про неизменяемость модулей >>> import math >>> math.pi 3.141592653589793 >>> math.pi = 4 >>> math.pi 4
Неизменяемый не значит что он не кешируется
2. в твоем первом примере (https://t.me/ru_python/1491800) нет никакого reload. 3. reload() может вернуть новый объект модуля (а может и не вернуть).
2 - обсуждал это ниже моего примера, думал, вы об этом, извиняюсь 3. пробовал модифицировать модуль и применить reload, id оставался прежним
опять делают выводы из наблюдаемого поведения. https://docs.python.org/3/library/importlib.html#importlib.reload The return value is the module object (which can be different if re-importing causes a different object to be placed in sys.modules).
Обсуждают сегодня