1. 在一个函数中对全局变量进行修改的时候,到底是否需要使用 global ?
答:要看你定义的变量是否是可变的。
num = 100
nuns = [11,22]
def test():
global num
num+=106
def test2():
nums.append(33)
print(num)
print(nums)
test()
print(num)
总结:
字符串,元组等就需要加
如果是列表,则不需要加global
例子1:
import threading
import time
g_num= 100
# 定义一个全局变量
def test1():
global g_num
g_num+= 1
print("-----in test1 g_num = %d----" % g_num)
def test2():
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()
time.sleep(1)
print("-----in main Thread g_num =%d---" % g_num)
if __name__== '__main__':
main()
例子2:
传入参数
import threading
import time
def test1(temp):
temp.append(33)
print("-----in test1 temp = %s----" % str(temp))
def test2(temp):
print("-----in test2 temp = %s----" % str(temp))
g_nums= [11, 22]
def main():
# target 指定这个线程去哪个函数执行代码
# args 指定调用函数所传递的参数,且 args 需为元组
t1= threading.Thread(target=test1, args=(g_nums,))
t2= threading.Thread(target=test2, args=(g_nums,))
t1.start()
time.sleep(1)
t2.start()
time.sleep(1)
print("-----in main Thread g_num = %s---" % str(g_nums))
if __name__== '__main__':
main()
共享全局变量的缺点:
造成资源竞争,比如一个列表多个线程写入,最后的结果不一定得到正确的结果