8.2 循环导入问题解决

8.2 循环导入问题解决

1. 循环导入示例

# m1.py模块文件
 from m2 import y
 x=10

# m2.py

 from m1 import x
 y=10

#输出
ImportError: cannot import name 'y' from partially initialized module 'm2' 
  • 问题原因分析

    (1)要想导入m2中的y,就要先去m1中找x,想拿到m1中的x,就·要先去m2找y.....,这就是循环导入问题。

    (2)现在有m1,m2两个文件,m1需要找到m2中的y,m2要找到m1中的x

    (3)由于代码自上而下运行,x,y都没有生成

    (4)m1找不到m2中的y,m2找不到m1的x,就造成了死循环。

2. 解决方法1

# m1.py
x=10
from m2 import y
print(y) 

#m2.py
y=20
from m1 import x

导入之前让变量提前先生成,但是又发现了一个新问题,会执行两次print,解决办法如下:

# m1.py
x=10
from m2 import y
# print(y) #会打印两次
if __name__=='__main__':
    print(y) #打印一次
#m2.py
y=20
from m1 import x

name变量

#__name__变量
print(__name__) 

# 1. __name__在当前文件未执行文件时候是‘__main__’,作为模块文件时候是文件名,如m1。
# 2. 未来在写模块测试所有打印和函数调用都放到if __name__='__main__':下,快捷键main+Tab。

3. 解决方法2

(1) 按照解决方法1写,导入所有东西时不好将所有定义放在导包前,代码写起来不美观。

(2)from m1 import 尽量放前面。

#m1.py
 x= 10 #全局,先生成x
 def f2():
     from m2 import y #局部,后导入y
     print(y)
 def f1():
     pass
 if __name__=='__main__':
     f2()

# m2.py
 from m1 import x
 y=20
 
  • 方法2分析
  1. 解决方法2把需要导入的名字y封装到函数体内部。
  2. 名字的执行顺序:内置(Python解释器启动时候)->全局(文件执行时候)->局部(函数调用时候)。
  3. 调用函数的时候才会用到y,调用函数之前,全局变量x已经生成,m2能找到x,y就能够生成,m1就能找到y,问题解决。
posted @ 2025-08-29 21:35  bokebanla  阅读(12)  评论(0)    收藏  举报