鱼C论坛

 找回密码
 立即注册
查看: 2001|回复: 5

有关python局部变量全局变量的问题

[复制链接]
发表于 2016-11-7 22:37:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我定义了一个全局变量Process,在一个函数pro_request()(代码第71行)里定义了一个局部变量pro,pro和Process都是列表,
在pro_request()这个函数里我将Process的值赋给pro(一开始用的切片赋值,后改成for循环把Process每个元素添加到pro里,代码第76行)
然后在这个函数里我改变pro某些元素的的值(代码第99行),为什么Process也发生了变化?相关代码已用红色标注。
QQ截图20161107125435.jpg QQ截图20161107125926.jpg

打印、改变pro值、再打印一次

打印、改变pro值、再打印一次


所有代码:
Process = []
Available = []

Work = []
Finish = []

def get_list(oldlist):
    newlist = []
    for i in range(len(oldlist)):
        if oldlist[i] != ' ':
            newlist.append(int(oldlist[i]))
    return newlist

def get_sourcenum(v1,v2,c):
    if c == '-':   
        v = list(map(lambda x: x[0]-x[1], zip(v1, v2)))
    else:
        v = list(map(lambda x: x[0]+x[1], zip(v1, v2)))
    return v

def cmp(v1,v2):
    flag = 1
    for i in range(len(v1)):
        if v1[i] > v2[i]:
            flag = 0
            break
    return flag

def init():
    global Available
    global Process
    sourcenum = int(input('请输入资源的种类数:'));
    Available = list(input('请输入各资源的数量(以空格分开):'))
    Available = get_list(Available)

    processnum = int(input('请输入进程的个数:'));
    for i in range(processnum):
        newprocess = [[0,0,0]]
        Max = list(input('请输入第'+str(i+1)+'个进程对各资源的最大需求(以空格分开):'))
        Max = get_list(Max)
        newprocess.insert(0,Max)
        Need = get_sourcenum(newprocess[0],newprocess[1],'-')
        newprocess.insert(2,Need)
        Process.append(newprocess)

def issafe(pro,ava):
    global Work
    global Finish
    Finish = []
    work = ava[:]
    Work = []
    Work.append(work)
    for i in range(len(pro)):
        Finish.append('false')
    count = 0
    while True:
        flag = 1
        if count == len(pro):
            return 1
        for i in range(len(pro)):
            if cmp(pro[i][2], work) == 1 and Finish[i] == 'false':
                work = get_sourcenum(work,pro[i][1],'+')
                Work.append(work)
                Finish[i] = 'true'
                flag = 0
                count +=1
                break
        if flag == 1:
            return 0
        

def pro_request(processname):
    global Available
    global Process
    pro = []
    ava = []
    for i in range(len(Process)):
        pro.append(Process[i])

        ava.append(Available[i])   
    request = list(input('请输入请求的各资源的数量(以空格分开):'))
    request = get_list(request)
    if cmp(request,pro[processname][0]) == 0:
        print('所需资源超过了该进程的最大需求!')
        return
    elif cmp(request, ava) == 0:
        print('尚无足够资源!')
        return
    else:
        print(ava is Available)
        print(pro is Process)
        ava = get_sourcenum(ava,request,'-')
        print(id(pro))
        print(id(Process))
        #pro[processname][1] = get_sourcenum(pro[processname][1],request, '+')
        #pro[processname][1] = list(map(lambda x: x[0]+x[1], zip(pro[processname][1], request)))
        
        for i in range(len(Process)):
            print('%s %s' % (Process[i][1],Process[i][2]))
        print('\n')
            
        for i in range(len(pro[processname][1])):
            pro[processname][1][i] += request[i]
            
        for i in range(len(Process)):
            print('%s %s ' % (Process[i][1],Process[i][2]))

            
        pro[processname][2] = get_sourcenum(pro[processname][2], request, '-')
        print(pro is Process)
        if issafe(pro,ava) == 1:
            print('系统处于安全状态,资源可分配!')
            Available = ava[:]
            Process = pro[:]
            #print(pro)
            #print(ava)
        else:
            print('系统进入不安全状态,此次资源分配作废!')
            #print(pro)
            #print(ava)
    for i in range(len(Process)):
        print('%s %s %s %s %s' % (Work[i],Process[i][1],Process[i][2],Work[i+1],Finish[i]))
        #print(Work[i],end = '')
        #print(Process[i][1:],end = ' ')
        #print(Work[i+1],end = ' ')
        #print(Finish[i],end = ' ')
        
        
init()
pro_request(1)
#print(Available)
#print(Process)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-8 09:01:38 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-8 09:02:10 | 显示全部楼层
有哪位大神跟我说一下,困惑我好久了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-8 15:34:24 | 显示全部楼层
好长。。。应该用代码格式发出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-9 11:25:03 | 显示全部楼层
我已经找到原因了。是因为Process里的每个元素也是个列表,所以修改pro也会改变Process.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-10 09:45:19 | 显示全部楼层
关于全局变量,一直不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-23 18:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表