import多模块,多模块在其它模块共享数据时也要注意变量的作用域问题,以下是个实例, 供参考:
共4个模块:recv_msg.py/handle_msg.py/common.py/main.py
而recv_msg.py/handle_msg.py这两模块在common里共享两数据:
common.py
data_list = list()
handle_flag = False
程序更简单,如下:
recv_msg.py:
from common import handle_flag
from common import data_list
def recv_msg():
print('正在接收数据... ...')
for i in range(1, 6):
data_list.append(i)
print('数据接收完成\n')
def show_msg():
print('接收的数据如下:')
for i in data_list:
print(i)
def recv_next_msg():
'''继续接收下一个数据'''
if handle_flag:
print('正在继续接收新的数据:')
for i in range(6, 11):
data_list.append(i)
print('数据接收完成\n')
else:
print('数据未处理完成,等待处理完成再接收... ...')
handle_msg.py
from common import handle_flag
from common import data_list
def handle_msg():
print('正在处理数据:')
for i in data_list:
print(i)
handle_flag = True
def test_handle_data():
if handle_flag:
print('---数据处理完成---')
else:
print('---数据未处理完成---')
main.py
from recv_msg import *
from handle_msg import *
if __name__ == '__main__':
recv_msg()
show_msg()
recv_next_msg()
handle_msg()
test_handle_data()
recv_next_msg()
show_msg()
run后得到的结果如下:
正在接收数据... ...
数据接收完成
接收的数据如下:
1
2
3
4
5
数据未处理完成,等待处理完成再接收... ...
正在处理数据:
1
2
3
4
5
---数据未处理完成---
数据未处理完成,等待处理完成再接收... ...
接收的数据如下:
1
2
3
4
5
请按任意键继续. . .
而我们希望得到的结果如下:
正在接收数据... ...
数据接收完成
接收的数据如下:
1
2
3
4
5
数据未处理完成,等待处理完成再接收... ...
正在处理数据:
1
2
3
4
5
---数据处理完成---
正在继续接收新的数据:
数据接收完成
接收的数据如下:
1
2
3
4
5
6
7
8
9
10
请按任意键继续. . .
为什么会出现这种情况呢?究其原因,出在from common import handle_flag后,在函数里对handle_flag的赋值上出问题了.
from common import handle_flag
这里,handle_flag在新的模块中,handle_flag相当于是在本地新建的一个全局变量,他的值指向了common模块中的值. 注意这样导入后,handle_flag相当于是recv_msg.py中的本地变量,既然是本量变量,所以它就不会再改变common中的同名变量的值了,就已失去了其共享意义了. 可能我们这时会想到,在调用时那global怎么样?其它也没有用,因为 handle_flag是一个本地全局变量,无法影响common.handle_flag的值
那如果修改呢?imoprt common
则在函数里修改handle_flag时,可以common.handle_flag来直接指定到common里的变量handle_flag, 这样也是可以修改成功的
# 修改后的
import common
def handle_msg():
print('正在处理数据:')
for i in common.data_list:
print(i)
common.handle_flag = True
def test_handle_data():
if common.handle_flag:
print('---数据处理完成---')
else:
print('---数据未处理完成---')
所以,在多模块中要在其它模块共享数据时,对于有需要修改全局的变量时,一定要注意,一定要import xxx, 最好不要用from xxx import yyy, 不然会踩坑而又很难查到.