如何区分全局变量和局部变量:
一个写在函数里面,一个写在函数外面。
如果要在函数里面修改全局变量:不用必须加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
结果:
说明:子线程和子线程之间共享全局变量