Как происходит импортирование в Python?

Лутц пишет:

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__, ...), если не по атрибуту, то как тогда?

Где можно почитать про механизм импортирования в подробностях?
  • Вопрос задан
  • 2644 просмотра
Пригласить эксперта
Ответы на вопрос 4
@ykalchevskiy
Я не очень понимаю первый вопрос, поэтому на него ответить не могу. А вот почитать про подробности можно тут: asvetlov.blogspot.ru/2010/05/blog-post.html и следующие части.

Upd (вопрос уточнен в комментарии):
>>> import sys
>>> import small
>>> sys.getrefcount(small) - 1
2
>>> del small
>>> sys.getrefcount(sys.modules['small']) - 1
1

При первой загрузке модуль попадает в словарь sys.modules, после этого используется уже эта загруженная версия. del small не удаляет модуль, а только уменьшает количество ссылок на него.
Ответ написан
@lega
Модуль является синглтоном для приложения.
Ответ написан
Комментировать
karabanov
@karabanov
Системный администратор
Задайте этот вопрос господину Андрею Григорьеву Кажется его e-mail выгляди так ei-grad@yandex-team.ru
Он наверняка знает ответ.
Ответ написан
qmax
@qmax
программер
если вас сммущает что y изменилось, а x не изменился, то импортирование тут не при чём.

y - это ссылка на объект в модуле, x - ссылка на константу
x = 100
устанавливает локальное имя x ссылкой на другоую константу
y[1] = 500
изменяет объект, который определён в модуле
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы