Python中线程的run()函数为何能访问主函数中的变量?
为什么 run()函数中可以用 value ???
路过的懂的麻烦解释一波,十分感谢!!!
Python中线程的run()函数为何能访问主函数中的变量?
了解一下 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


