导入后更改模块变量

时间:2012-09-03 05:27:57

标签: python python-2.7 import circular-reference

SO pyton gurus!我刚刚发现了一个我不明白的惊人现象。问题可以最好地显示为代码:

#== 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正确更新?

1 个答案:

答案 0 :(得分:4)

  1. 因为将dad.py加载为__main__模块与导入dad.py作为dad模块无关。
  2. 请参阅我对1的回答。
  3. 如果必须,请改为导入__main__。但总的来说,不要尝试这个。找到另一种完成任务的方法(例如课程)。
  4. 在dad.py顶部打印__name__将说明这一点。