目录
- 8.2 循环导入问题解决
- 1. 循环导入示例
- 2. 解决方法1
- name变量
- 3. 解决方法2
8.2 循环导入问题解决
1. 循环导入示例
# m1.py模块文件from m2 import yx=10# m2.pyfrom m1 import xy=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.pyx= 10 #全局,先生成xdef f2():from m2 import y #局部,后导入yprint(y)def f1():passif __name__=='__main__':f2()# m2.pyfrom m1 import xy=20
- 方法2分析
- 解决方法2把需要导入的名字y封装到函数体内部。
- 名字的执行顺序:内置(Python解释器启动时候)->全局(文件执行时候)->局部(函数调用时候)。
- 调用函数的时候才会用到y,调用函数之前,全局变量x已经生成,m2能找到x,y就能够生成,m1就能找到y,问题解决。