Лутц пишет:
from module import name1, name2
эквивалентно, по крайней мере, концептуально:
import module
name1 = module.name1
name2 = module.name2
del module
Рассмотрим модуль "small.py":
x = 1
y = [1, 2]
и выполним код:
from small import x, y
print('from small import x, y >> x, y:', x, y)
x = 100
y[1] = 500
print('x, y:', x, y)
import small
print('import small >> small.x, small.y:', small.x, small.y)
Получим:
from small import x, y >> x, y: 1 [1, 2]
x, y: 100 [1, 500]
import small >> small.x, small.y: 1 [1, 500]
Пусть после удаления модуля small (шаг из рассмотренной выше эквивалентной последовательности) ссылка на его атрибут еще есть (y), т. е. сборщик мусора не удалил объект модуля, но при импортировании он этот объект опять связал с именем small. По какому атрибуту он это сделал (__file__, __cached__, ...), если не по атрибуту, то как тогда?
Где можно почитать про механизм импортирования в подробностях?