|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 然后不就又进入死循环了吗。。。
使用import b 和使用 from b import y 导入模块的机理不同
import b 导入会生成b模块的cache 文件,你可以发现在文件夹中自动产生 __pycache__ 文件夹,
不会产生循环嵌套导入问题。
|
|