鱼C论坛

 找回密码
 立即注册
查看: 1697|回复: 2

[已解决]python 51课后0

[复制链接]
发表于 2018-9-14 16:22:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# 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()么



最佳答案
2018-9-14 19:18:38
如果导入模块,name 会变成模块的名字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-14 19:18:38 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
如果导入模块,name 会变成模块的名字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 16:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表