Python中线程的run()函数为何能访问主函数中的变量?

1.png 2.png
为什么 run()函数中可以用 value ??? 路过的懂的麻烦解释一波,十分感谢!!!


Python中线程的run()函数为何能访问主函数中的变量?
16 回复

了解一下 Python scoping 的 LEGB 法则吧
碰到一个变量,例如 value,会先在本层 Local 作用域搜索,找到了就返回,找不到就会继续向外层搜索~


在Python里,线程的run()方法能访问主函数变量,这其实和线程本身没关系,而是Python的变量作用域和闭包在起作用。

当你在线程类里定义run()方法时,如果它引用了外部变量,Python会通过闭包机制捕获这些变量。简单说就是函数记住了自己被定义时的环境。

看个例子就明白了:

import threading

def main():
    # 主函数局部变量
    shared_data = []
    
    class MyThread(threading.Thread):
        def run(self):
            # 这里能直接访问shared_data
            shared_data.append("thread_data")
            print(f"Thread accessing: {shared_data}")
    
    thread = MyThread()
    thread.start()
    thread.join()
    
    print(f"Main after thread: {shared_data}")

if __name__ == "__main__":
    main()

运行这个代码,你会发现线程确实能修改shared_data列表。这是因为MyThread类在main()函数内部定义,它的run()方法通过闭包捕获了shared_data变量。

更常见的写法是用lambda或者函数传参,原理都一样——变量被捕获或传递到线程的执行上下文中:

import threading

def worker(data):
    data.append("modified")
    print(f"In thread: {data}")

def main():
    my_list = []
    thread = threading.Thread(target=worker, args=(my_list,))
    thread.start()
    thread.join()
    print(f"After thread: {my_list}")

main()

所以本质上,这不是线程的特殊能力,而是Python的变量作用域规则。只要变量在作用域内可见,线程里的代码就能访问它。当然,多个线程同时修改共享变量时需要加锁,不然会出数据竞争的问题。

一句话总结:这是Python作用域和闭包的自然结果,不是线程特有的功能。

你这里的 value 相当于全局变量

main
下面的全局变量 value 改成其他名字
就不会这样了,
碰巧变量名一样而已

你这里没有主“函数”啊

紫红色的__init__和紫色的 self 真骚。我喜欢这配色

上面老哥们已经说了,不过我想说的是,你看着这么多下划线的 warning 就真的不头疼?

?? 你这不是自己传进去的??

普通 if 不会形成新作用域,所以 value 是全局变量……

你是不是对线程有什么误解,线程本来就是共享数据。

所以主函数在哪……


懂了 谢谢各位的回复 应该就是下面这张图中的意思,误会线程大兄弟了。
![](
)
另外

这是 Pycharm 自带的配色:)
临时写的试试看,对不住强迫症同学了:) 忍忍哈

读操作是这样。写操作从来都是在当前作用域里写。

除非有 global 或者 nonlocal

回到顶部