|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
请问一下,在第51课课后习题中,执行a.py,b.py均会报错,添加if __name__=='__main__':就可以解决了,代码如下(已修正):程序报错是因为执行b.py文件之后过程如下:
执行 b.py -> import a -> 查找 a 模块 -> 未发现 a 模块对象 -> 导入 a.py -> import b -> 查找 b 模块 -> 发现 b 模块对象 -> 接着往下执行字节码(import a 已执行过,Python 有机制确保不重复导入,因而不会再执行) -> a.x() -> 在 a 模块中找不到 x(),因为 a 还没有被完全导入。
添加if __name__=='__main__':之后也就是把.py文件当成独立程序运行,会执行a.x(),如果是当成模块导入的时候不会执行
但是添加语句之后,在运行b.py()执行过程不还是像上边那样,最后到a.x(),找不到x报错吗?但事实是可以运行,请问这是为什么,添加if __name__=='__main__影响了哪里?
正确代码:
#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()
执行过程是这样子的,小甲鱼讲的并不是特别清楚
若没有 if __name__=='__main__': 这一句的话,执行过程如下,红色部分小甲鱼没有说,导致很多人不理解:
执行b.py -> import a -> 查找 a 模块 -> 未发现 a 模块对象 -> 导入 a.py -> import b -> 查找 b 模块 -> 发现 b 模块对象 -> 接着上次执行的位置往下执行字节码(import a 已执行过,Python 有机制确保不重复导入,因而不会再执行) -> 导入def y() -> 执行 a.x() -> 在 a 模块中找不到 x(),因为 a 还没有被完全导入。
若有if __name__=='__main__': 这一句的话,执行过程如下:
执行b.py -> import a -> 查找 a 模块 -> 未发现 a 模块对象 -> 导入 a.py -> import b -> 查找 b 模块 -> 发现 b 模块对象 -> 接着上次执行的位置往下执行字节码(import a 已执行过,Python 有机制确保不重复导入,因而不会再执行) -> 导入def y() -> 判断if __name__=='__main__' 发现__name__ == 'b',不执行下一句a.x(),b模块导入完成 -> 继续导入a模块,接着上次执行的位置往下执行字节码(import b 已执行过)-> 导入def x() -> 判断if __name__=='__main__' 发现__name__ == 'a',不执行下一句b.y(),a模块导入完成 -> 继续执行b模块,这时接上了第一个箭头后面的import a,然后定义 def y() (这里实际上是又定义了一遍该函数)-> 判断if __name__=='__main__' 发现__name__ == '__main__',执行下一句a.x()。
我修改了一下这两文件,添加了一些print,可以很直观的看到执行过程
- # a.py
- import b
- print('In a,__name__ is',__name__ )
- def x():
- print('x')
- print('aa')
- if __name__ == "__main__":
- b.y()
- # b.py
- import a
- print('In b,__name__ is',__name__ )
- def y():
- print('y')
- print('bb')
- if __name__ == "__main__":
- a.x()
复制代码
运行结果如下
- In b,__name__ is b
- bb
- a a
- aa
- In b,__name__ is __main__
- bb
- x
复制代码
|
|