【发布时间】:2018-07-18 16:52:14
【问题描述】:
如果我作为worker运行具有以下函数的线程,
q = queue.Queue()
def worker():
while True:
t = {}
for i in range(3):
t['a'] = i
q.put(t)
队列中填充了完全相同的字典,即{'a': 2},而不是序列{'a': 0}, {'a': 1}, {'a': 2}。我认为这是因为 put() 方法在 for 循环完成后运行,i 的最后一个值为 2。我的解释正确吗?
现在,如果我在 for 循环中移动字典的实例化,
def worker():
while True:
for i in range(3):
t = {'a': i}
q.put(t)
队列中填充了所需的序列。我的解释是,首先,我在内存中创建一个字典对象,然后开始一个 for 循环并重新分配其值 3 次,但 put() 调用发生在循环完成后。在第二个实例中,我在 for 循环的每次迭代中创建一个新的字典对象,因此当循环之后发生 put() 调用时,它们会使用自己的键值对访问字典的 3 个不同实例。
谁能解释一下幕后发生的事情?
【问题讨论】:
-
不,Queue.put 不是异步的。您只是一遍又一遍地添加相同的字典。您没有创建副本。查看副本。
标签: multithreading python-3.x queue late-binding