17、多任务-多线程共享全局变量

如何区分全局变量和局部变量:

一个写在函数里面,一个写在函数外面。

如果要在函数里面修改全局变量:不用必须加global

 

vim 06-函数里面修改全局变量.py 

num = 100

def test():
    global num
    num += 100
print(num)
test()
print(num)

以上代码执行的结果,第一次打印是100,调用test函数后第二次打印的结果是200

修改上面代码,增加一个列表变量

​
num = 100
nums = [11,22]

def test():
    global num
    num += 100


def test2():
    nums.append(33)

print(num)
print(nums)
test()
test2()
print(num)
print(nums)

​

test2函数中没有加global,但是执行的结果第二次打印nums时,结果是[11,22,33],也修改了全局列表变量。

对于变量的理解:

num=100:定义了一个变量num,num指向了一个地方,这个地方里面有一个100

nums=[11,22],nums指向了一个地方,nums.append可以往指向的这个地方加东西,insert remove都可以修改,不用加global;但是如果是nums += [100,200],相当于[11,22]+[100,200],把原来列表中的内容拿出来加上一个新的,最终结果是[11,22,100,200]成为一个新的列表,此时的nums箭头指向更改了

如果修改的是这个地方里面的数据,不需要加global,前提是可以修改的动,是否能改的动,要看变量是可变还是不可变(数字 、字符串、元组,不可变,其它都是可变的。)。

全局变量没有改箭头就不用加global,全局变量如果改了箭头就要加global

即看对全局变量的指向是否进行了修改,如果修改了指向,即让全局变量指向了一个新的地方,那么必须使用global,如果仅仅是修改了指向空间里的数据,此时不用必须使用global

vim 07-线程共享全局变量.py

improt threading
import time


#定义一个全局变量
g_num = 100


def test1():
    #修改全局变量加global声明
    global g_num
    g_num += 1
    print("---in test1---g_num=d%" % g_num)


def test2():
    # 仅获取不修改全局变量,不需要加global
    print("---in test2---g_num=d%" % g_num)



def main():
    """定义两个子线程,一个对全局变量进行修改,一个打印全局变量的值"""
    t1 = threading.Thread(target=test1)
    t2 = threading.Thread(target=test2)
    t1.start
    time.sleep(1)
    t2.start
    print("---in main g_num=d%" % g_num)

if __name__ == "__main__":
    main()

为了保证t1一定先执行,在t1.start后加time.sleep

结果:

说明:子线程和子线程之间共享全局变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值