python 51课后0
# a.pyimport b
def x():
print('x')
b.y()
# b.py
import a
def y():
print('y')
a.x() //错误程序
----------------------------------------------
----------------------------------------------
# a.py
import b
def x():
print('x')
if __name__ == "__main__":
b.y()
# b.py
import a
def y():
print('y')
if __name__ == "__main__":
a.x() //修改后程序
小甲鱼解释:因为在执行 b.py 的加载过程中,需要创建新的模块对象 b,然后执行 b.py 对应的字节码。当遇到第一条语句(import a)的时候,Python 会转而去导入 a.py 并生成模块对象 a。同样遇到第一条语句(import b)的时候,Python 就跑去导入模块 b,此时发现 b 模块已经导入(在 sys.modules 中存在),继而执行 b 模块的字节码,当执行到 a.x() 的时候,由于模块 a 此时并未完全导入,所以抛出 AttributeError 异常。 )
没怎么看懂 怎么算是完全导入流程是什么 就算加上if __name__ == "__main__": 不也是要执行a.x()么
如果导入模块,name 会变成模块的名字 claws0n 发表于 2018-9-14 19:18
如果导入模块,name 会变成模块的名字
哦哦 最初运行 b.py 然后需要导入 a.py a.py又要导入b.py如果没有if __name__ == "__main__": 就执行了a.x()
但是b.py 导入a.py还没成功所以报错两个模块都加上 if __name__ == "__main__" 就不会执行a.x()和之后的b.y()
只执行最初b.py的a.x()输出x差不多这个意思么 如果只在b.py加if __name__ == "__main__" 就会输出 y x
页:
[1]