HISIOISIH 发表于 2018-9-14 16:22:33

python 51课后0

# a.py
import 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()么



claws0n 发表于 2018-9-14 19:18:38

如果导入模块,name 会变成模块的名字

HISIOISIH 发表于 2018-9-14 22:01:52

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]
查看完整版本: python 51课后0