鱼C论坛

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

导入模块的问题

[复制链接]
发表于 2019-9-16 21:48:31 | 显示全部楼层 |阅读模式

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

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

x
. 执行下边 a.py 或 b.py 任何一个文件,都会报错,请改正程序。
# a.py
import b

def x():
    print('x')

b.y()

# b.py
import a

def y():
    print('y')

a.x()

执行 b.py 引发下边异常:
>>>
Traceback (most recent call last):
  File "/Users/FishC/Desktop/b.py", line 1, in <module>
    import a
  File "/Users/FishC/Desktop/a.py", line 1, in <module>
    import b
  File "/Users/FishC/Desktop/b.py", line 6, in <module>
    a.x()
AttributeError: 'module' object has no attribute 'x'

小甲鱼给的解答是这样的:
因为在执行 b.py 的加载过程中,需要创建新的模块对象 b,然后执行 b.py 对应的字节码。当遇到第一条语句(import a)的时候,Python 会转而去导入 a.py 并生成模块对象 a。同样遇到第一条语句(import b)的时候,Python 就跑去导入模块 b,此时发现 b 模块已经导入(在 sys.modules 中存在),继而执行 b 模块的字节码,当执行到 a.x() 的时候,由于模块 a 此时并未完全导入,所以抛出 AttributeError 异常。
换句话说,就是
执行 b.py -> import a -> 查找 a 模块 -> 未发现 a 模块对象 -> 导入 a.py -> import b -> 查找 b 模块 -> 发现 b 模块对象 ->(有疑问) 接着往下执行字节码(import a 已执行过,Python 有机制确保不重复导入,因而不会再执行) -> a.x() -> 在 a 模块中找不到 x(),因为 a 还没有被完全导入嘛……
上句中,“(有疑问)”这块,我的疑惑是:
此时,发现b模块已经存在,就不会导入b模块了,但是依旧执行b.py,于是代码执行从a.py跳到了b.py  是吗?还是说,发现b模块已经存在,代码a.py里import b 以后的所有代码均不执行,于是代码只能返回到b.py?
import a 已执行过,接下来 print('y')也没有执行呀?
如果我上边没有描述清楚,就麻烦大佬们 把 上边步骤中“查找 b 模块 -> 发现 b 模块对象 -> 接着往下执行字节码(import a 已执行过,Python 有机制确保不重复导入,因而不会再执行) -> a.x()”的过程更加详细的说明一下,比如代码执行此时是在哪个文件里
感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-9-17 08:08:10 From FishC Mobile | 显示全部楼层
两个模块相互引用,不是自己找虐吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-17 09:18:36 | 显示全部楼层
wp231957 发表于 2019-9-17 08:08
两个模块相互引用,不是自己找虐吗

这是小甲鱼上课的课后作业,不是得自己探索吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-19 08:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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