鱼C论坛

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

[已解决]关于第50讲 导入模块的问题

[复制链接]
发表于 2020-1-6 11:11:32 | 显示全部楼层 |阅读模式

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

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

x
这个是源程序及运行结果
# a.py
from b import y
def x():
    print('x')

# b.py
from a import x
def y():
    print('y')

>>>
Traceback (most recent call last):
  File "/Users/FishC/Desktop/a.py", line 1, in <module>
    from b import x
  File "/Users/FishC/Desktop/b.py", line 1, in <module>
    import a
  File "/Users/FishC/Desktop/a.py", line 1, in <module>
    from b import x
ImportError: cannot import name 'x'
答:这个是循环嵌套导入问题。无论运行 a.py 或 b.py 哪一个文件都会抛出 ImportError 异常。这是因为在执行其中某一个文件(a.py)的加载过程中,会创建模块对象并执行对应的字节码。但当执行第一个语句的时候需要导入另一个文件(from b import y),因此 CPU 会转而去加载另一个文件(b.py)。同理,执行另一个文件的第一个语句(from a import x)恰好也是需要导入之前的文件(a.py)。此时,之前的文件处于仅导入第一条语句的阶段,因此其对应的字典中并不存在 x,故抛出“ImportError: cannot import name 'x'”异常。]~


这是答案给的结果
# a.py
import b

def x():
print('x')

# b.py
import a

def y():
    print('y')

a.x()



我想不明白,答案给的不也差不多 import b 的时候进入b.py 执行第一个语句 import a 然后不就又进入死循环了吗。。。
最佳答案
2020-1-6 14:04:46
使用import b 和使用 from  b import y 导入模块的机理不同
import b 导入会生成b模块的cache 文件,你可以发现在文件夹中自动产生 __pycache__ 文件夹,
不会产生循环嵌套导入问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-6 14:04:46 | 显示全部楼层    本楼为最佳答案   
使用import b 和使用 from  b import y 导入模块的机理不同
import b 导入会生成b模块的cache 文件,你可以发现在文件夹中自动产生 __pycache__ 文件夹,
不会产生循环嵌套导入问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-10 16:11:50 | 显示全部楼层
XiaoPaiShen 发表于 2020-1-6 14:04
使用import b 和使用 from  b import y 导入模块的机理不同
import b 导入会生成b模块的cache 文件,你可 ...

from b import y也会产生 __pycache__ 文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 17:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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