python的模块导入问题_python中多模块导入的注意点

from recv_msg import *

from handle_msg import *

defmain():#1. 接收数据

recv_msg()#2. 测试是否接收完毕

test_recv_data()#3. 判断如果处理完成,则接收其它数据

recv_msg_next()#4. 处理数据

handle_data()#5. 测试是否处理完毕

test_handle_data()#6. 判断如果处理完成,则接收其它数据

recv_msg_next()if __name__ == "__main__":

main()

recv_msg.py

from common importRECV_DATA_LISTfrom common importHANDLE_FLAG#import common

defrecv_msg():"""模拟接收到数据,然后添加到common模块中的列表中"""

print("--->recv_msg")for i in range(5):

RECV_DATA_LIST.append(i)deftest_recv_data():"""测试接收到的数据"""

print("--->test_recv_data")print(RECV_DATA_LIST)defrecv_msg_next():"""已经处理完成后,再接收另外的其他数据"""

print("--->recv_msg_next")ifHANDLE_FLAG:#if common.HANDLE_FLAG:

print("------发现之前的数据已经处理完成,这里进行接收其他的数据(模拟过程...)----")else:print("------发现之前的数据未处理完,等待中....------")

handle_msg.py

from common importRECV_DATA_LISTfrom common importHANDLE_FLAG#import common

defhandle_data():"""模拟处理recv_msg模块接收的数据"""

print("--->handle_data")for i inRECV_DATA_LIST:print(i)#既然处理完成了,那么将变量HANDLE_FLAG设置为True,意味着处理完成

global HANDLE_FLAG

HANDLE_FLAG =True#common.HANDLE_FLAG = True

deftest_handle_data():"""测试处理是否完成,变量是否设置为True"""

print("--->test_handle_data")ifHANDLE_FLAG:#if common.HANDLE_FLAG:

print("=====已经处理完成====")else:print("=====未处理完成====")

commom.py

RECV_DATA_LIST = list() #用来存储数据

HANDLE_FLAG = False #用来标记是否处理完成

执行结果如下:

1610045-20200225232215507-2062371991.png

对比main.py的执行顺序其他都好理解,唯独箭头处不符合预计,按照代码逻辑此处预期打印“已处理”,然而结果却打印“未处理”,通读代码推断原因应该是 HANDLE_FLAG在handle_msg.py的handle_data()方法中没有被改为Ture。

HANDLE_FLAG为什么没有被修改为Ture?

在handle_msg.py文件中,HANDLE_FLAG的使用方式为 from common import HANDLE_FLAG ,该导入方式相当于是在handle_msg.py 生成一个叫做HANDLE_FLAG 的变量,并且这个变量指向的是common.py里面HANDLE_FLAG的值(False),当在执行 HANDLE_FLAG =True 这行代码时 其实是将变量handle_msg.py中的 HANDLE_FLAG 重新指向了一个新的值为True(这个过程可以理解为赋值的过程,即修改的是变量的指向而不是变量指向的值),此时common里面的HANDLE_FLAG 值依然是False, 所以在recv_msg.py使用 from common import HANDLE_FLAG 导入时,HANDLE_FLAG这个变量仍指向False。

1610045-20200225235120061-1219600639.png

如何解决这个问题?

在handle_msg.py文件中,将HANDLE_FLAG的使用方式改为 import common,再使用common.HANDLE_FLAG 调用即可解决。具体原理可以理解为:在handle_msg.py中生成一个叫做common的变量,这个变量指向的是common文件,而common.HANDLE_FLAG可以理解为指向common文件中的 HANDLE_FLAG 变量名而不是这个变量名的值,所以在handle.py执行 common.HANDLE_FLAG=Ture 让它的指向从False变成了True后,在recv_msg.py使用 common.HANDLE_FLAG可以获取到Ture这个值。

1610045-20200225235438118-1392271448.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值