如何通过线程为类变量(numpy数组)赋值?及代码赋值失效问题
问题解答
1. 代码中m.mydict值未改变的原因
你把self.mydict['a1']作为参数传给mythread时,传的是当前a1对应的None值。在Python里,执行arg2 = b只是把局部变量arg2的指向换成了新的numpy数组b,完全没碰原字典里a1键对应的内容。简单说,你传的是字典值的副本引用,改局部变量不会影响原字典的条目。
2. 如何用另一个线程为类变量(numpy数组)分配新值
要实现这个需求,得让线程直接操作类的属性(比如字典的键、类的numpy数组变量),同时用锁保证线程安全。下面是修正后的代码:
from threading import Thread, Lock import numpy as np class MyClass(object): def __init__(self): self.mydict = {'a1': None, 'a2': None} self.lock = Lock() def mythread(self, key): self.lock.acquire() try: b = np.array([9,9,9]) self.mydict[key] = b # 直接修改字典的键值对 finally: self.lock.release() # 用try-finally确保锁一定会释放,避免异常锁死 def test(self, condition): key = 'a1' if condition else 'a2' t = Thread(target=self.mythread, args=(key,)) t.start() t.join() # 等待线程执行完毕再继续 m = MyClass() m.test(True) print(m.mydict)
运行后输出:
{'a1': array([9, 9, 9]), 'a2': None}
核心注意点:
- 别传字典的值,传字典的键名,让线程直接修改
self.mydict[key] - 用
try-finally包裹锁释放逻辑,防止异常导致锁无法释放 - 要等线程执行完再看结果,用
join()比time.sleep()更可靠
如果是直接操作类的numpy数组变量(比如self.var),逻辑类似:
def mythread(self): self.lock.acquire() try: self.var = np.array([9,9,9]) finally: self.lock.release()
内容的提问来源于stack exchange,提问作者firion
相关产品推荐
相关产品推荐

