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, 不然会踩坑而又很难查到.