Изменение переменных модуля после импорта

ТАКИЕ гуру pyton! Я только что обнаружил удивительное явление, которого не понимаю. Проблему лучше всего показать в виде кода:

#== kid.py ==#
import dad

def spam ():
    dad.spam()


#== dad.py ==#
import kid

x = 1
print "body", x

x = 2
def spam ():
    print "spam", x

if __name__ == '__main__':
    x = 3
    spam()
    kid.spam()
    print "main", x

Я использую Python 2.7.3. Можете ли вы угадать вывод python dad.py? Ответ таков (я бы хотел, чтобы у SO был тег затенения спойлера) body 1 body 1 spam 3 spam 2 main 3. Так не могли бы вы объяснить

  1. Почему body 1 печатается дважды?
  2. Как может быть dad.x != kid.dad.x?
  3. Если мне действительно нужно, чтобы два модуля импортировали друг друга, как я могу изменить его, чтобы правильно обновить kid.dad.x?

person h2kyeong    schedule 03.09.2012    source источник


Ответы (1)


  1. Потому что загрузка папы.py в качестве модуля __main__ не зависит от импорта папы.py в качестве модуля dad.
  2. Смотрите мой ответ на 1.
  3. Вместо этого импортируйте __main__, если вы должны. Но вообще, не пытайтесь это сделать. Найдите другой способ выполнения своих задач (например, занятия).

Печать __name__ в верхней части папы.py проиллюстрирует это.

person Ignacio Vazquez-Abrams    schedule 03.09.2012
comment
А-ха, __main__ был секрет! Затем я запущу его как модуль. Спасибо небеса! - person h2kyeong; 03.09.2012