鱼C论坛

 找回密码
 立即注册
查看: 1675|回复: 12

[已解决]课后作业有不懂的一题,请大佬详细解释下

[复制链接]
发表于 2018-5-30 09:08:13 | 显示全部楼层 |阅读模式
50鱼币
第51讲手动第0题.
困惑很久,希望大佬帮忙,
如图所示,在我运行b.py的时候, 在打印的时候顺序看不懂了,为什么在b.py中没有调用y()函数,它还是会走过去打印呢?
在3到4的这个打印顺序不理解,y()函数没有调用为什么也输出了, 在打印完后又重新走了一遍b.py函数?
最佳答案
2018-5-30 09:08:14
比比皆是 发表于 2018-5-30 16:56
非常感谢大佬~,我就是想不通才问的


#注1: 此时是从a.py中调用b模块 ,因此而b此时是作为模块使用不是主函数,所以此时__name__不等于'__main__',而是等于模块名b,也就没有进入if语句,直到将a读完都只是运行了一个import a 的指令,第二次运行b才是真正的主函数

图片显示

图片显示

最佳答案

查看完整内容

#注1: 此时是从a.py中调用b模块 ,因此而b此时是作为模块使用不是主函数,所以此时__name__不等于'__main__',而是等于模块名b,也就没有进入if语句,直到将a读完都只是运行了一个import a 的指令,第二次运行b才是真正的主函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-30 09:08:14 | 显示全部楼层    本楼为最佳答案   
比比皆是 发表于 2018-5-30 16:56
非常感谢大佬~,我就是想不通才问的


#注1: 此时是从a.py中调用b模块 ,因此而b此时是作为模块使用不是主函数,所以此时__name__不等于'__main__',而是等于模块名b,也就没有进入if语句,直到将a读完都只是运行了一个import a 的指令,第二次运行b才是真正的主函数
捕获.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-30 09:19:50 | 显示全部楼层
难道是3.7的bug?
我的3.6执行结果如下:
在b模块中
跳过了 def y()...
b
在a模块中
在b模块中
跳过了 def y()...
__main__
__main__
x111111111
x.()过来了
a.x()进来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-30 10:01:03 | 显示全部楼层
你这个执行的代码应该是跟展示的代码不一致。比如结果倒数第二行的x,代码中完全没有打印的地方,又比如a.x()中的内容没有被打印。
可能是你改过以后 ,执行代码未更新导致的。你可重开一下idle
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-30 11:12:25 | 显示全部楼层
本帖最后由 比比皆是 于 2018-5-30 11:19 编辑

代码没有改动过,还是一样的问题。b模块打开直接运行还是出现以上的问题,为什么print(__name__)后会跳转到 a.py 模块中后又跳转到运行 b.py 模块呢,不是应该直接往下运行 判断 if __name__ == '__main__' 不成立后结束吗? 在一个问题是倒数第二行输出x有点不懂,我现在又用3.3.3又运行了一遍,显示如图,请大佬帮忙详细讲解下运行流程~~

问题

问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-30 13:44:34 | 显示全部楼层
比比皆是 发表于 2018-5-30 11:12
代码没有改动过,还是一样的问题。b模块打开直接运行还是出现以上的问题,为什么print(__name__)后会跳转到 ...

a.py好像还是没保存状态,你保存再试下,我先抄一遍代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-30 13:56:24 | 显示全部楼层
本帖最后由 Python小当家 于 2018-5-30 13:57 编辑
Python小当家 发表于 2018-5-30 13:44
a.py好像还是没保存状态,你保存再试下,我先抄一遍代码


我运行了一下发现直接报错,这是因为a、b之间相互引用导致的错误。
b的第一句就去import a ,然后此时程序就开始去看a,而a中第一句import b又回去看b,此时a更下面的内容还没有被程序看到,所以在读到a.x()的时候程序根本不知道a的后面还有一个x()。所以报错。
将a中的import b删掉后就正常了。(a程序没有用到b,也不需要import b)
至于你一开始的打印错误,我依然认为是你编辑了a没有保存
捕获.JPG
捕获.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-30 14:52:16 | 显示全部楼层
谢谢你的提示,在之前a.py的确没有保存。
但是在我保存后运行b.py模块的时候(我的b.py代码中 print(__name__) 下面有 if __name__== '__main__' 判断语句) ,为什么在if __name__== '__main__'第一次判断没成立之前又会跳转执行a.py模块,最后又反转回来在次运行b.py模块呢?
新手提问,请大佬详细解释下,非常感谢
20180530.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-30 16:26:05 | 显示全部楼层
还是之前说的那个双向调用的原理,你可以先自己想想能不能想通,1小时后下课回去给你画示意图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-30 16:56:01 | 显示全部楼层
Python小当家 发表于 2018-5-30 16:26
还是之前说的那个双向调用的原理,你可以先自己想想能不能想通,1小时后下课回去给你画示意图

非常感谢大佬~,我就是想不通才问的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-30 20:03:37 | 显示全部楼层
为什么在if __name__== '__main__'第一次判断没成立之前又会跳转执行a.py模块,最后又反转回来在次运行b.py模块呢?\
大佬,这个能用语言表述下吗?
图里能看懂它的运行轨迹!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-30 20:09:28 | 显示全部楼层
比比皆是 发表于 2018-5-30 20:03
为什么在if __name__== '__main__'第一次判断没成立之前又会跳转执行a.py模块,最后又反转回来在次运行b.py ...

因为这是在import a中的import b执行的,所以条件不成立后就直接跳过if模块;于是import a中的import b语句也就执行完毕,然后执行Import a中的其他语句(a.py的后面语句),全部执行完后import a也就结束,这时正式开始b.py的正文
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-30 20:58:27 | 显示全部楼层
Python小当家 发表于 2018-5-30 09:08
#注1: 此时是从a.py中调用b模块 ,因此而b此时是作为模块使用不是主函数,所以此时__name__不等于'__ma ...

非常感谢,终于弄懂了....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 13:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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