线程中的变量为什么有的需要global引用呢?有的不需要呢?

发布于 2023-12-11 18:53:09

案例1

import threading
import time
 
list1 = [0] * 10
 
 
def task1():
    for i in range(len(list1)):
        list1[i] = 1
        time.sleep(0.5)
        print('--1-->', list1[i])
 
 
def task2():
    for i in range(len(list1)):
        print('--2-->', list1[i])
        time.sleep(0.5)
 
 
if __name__ == '__main__':
    t1 = threading.Thread(target=task1)
    t2 = threading.Thread(target=task2)
    t2.start()
    t1.start()
    t2.join()
    t1.join()
    print(list1)

案例2

import threading
from time import sleep
 
ticket = 1000
 
 
def run1():
    global ticket  # 使用全局变量
    for i in range(100):
        sleep(0.1)
        ticket -= 1
        print("-------->这是run1,票的值是", ticket)
 
 
def run2():
    global ticket  # 使用全局变量
    for i in range(150):
        sleep(0.2)
        ticket -= 1
        print("-------->这是run2,票的值是", ticket)
 
 
if __name__ == "__main__":
    th1 = threading.Thread(target=run1, name="th1")
    th2 = threading.Thread(target=run2, name="th2")
    th1.start()
    th2.start()
    th1.join()
    th2.join()
    print('money:', ticket)

以上代码都能正在运行。
问题一、代码案例1中的“list1”和代码案例2中的“ticket”是否属于主线程的变量?
问题二、代码案例1中的“list1”和代码案例2中的“ticket”是否属于全局变量?
问题三、为什么代码案例1两个子线程不需要增加global list1,而可以直接使用变量list?
问题四:对比代码案例1,为什么代码案例2中的两个子线程必须增加global ticket,才可以使用变量ticket?
哪位大神帮忙解读一下呢?

查看更多

关注者
0
被浏览
602
0 个回答
暂无答案,快来添加答案吧

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览