Python “.append”和“+;”之间的差异在函数内部使用时
我试图理解Python “.append”和“+;”之间的差异在函数内部使用时,python,multiprocessing,Python,Multiprocessing,我试图理解池.apply\u async中的回调函数是如何工作的,并遇到了以下问题。在回调之外,我定义 results = [] 并且希望在值可用时,使用回调将工作进程的返回值附加到结果中 但奇怪的是,这个语句(在回调中)可以工作: 但是 报告未分配的引用错误 发生了什么事?任何洞察都将不胜感激 以下是完整的代码: from multiprocessing import Pool import random results = [] def f(t): return t def
池.apply\u async
中的回调
函数是如何工作的,并遇到了以下问题。在回调之外,我定义
results = []
并且希望在值可用时,使用回调将工作进程的返回值附加到结果中
但奇怪的是,这个语句(在回调中)可以工作:
但是
报告未分配的引用错误
发生了什么事?任何洞察都将不胜感激
以下是完整的代码:
from multiprocessing import Pool
import random
results = []
def f(t):
return t
def cb_append_result(t):
# reports "local variable 'results' referenced before assignment"
# results += [t]
# Okay
results.append(t) # works
if __name__ == '__main__':
pool = Pool()
t = random.random()
pool.apply_async(f,args=(t,),callback=cb_append_result)
pool.close()
pool.join()
print("Result is {}".format(results))
(补充)该问题与多处理或回调无关(请参阅下面的答案)。但要解决上述问题,回调函数应编写为
def cb_append_result(t):
global results
results += [t]
该解决方案实际上与多处理或回调无关。关键是使用global
语句显式引用全局变量
下面是一个简单的代码来演示这个问题
y = []
# doesn't work
def f(x):
y += [x]
# works
def g(x):
global y # <===== Answer!!
y += [x]
# works
def h(x):
y.append(x)
# f(1) # local variable 'y' referenced before assignment
g(1) # works
print(y)
h(2) # works
print(y)
所以实际上,回调
业务等都是混淆。我编辑了我原来的帖子 是的,就是这样!事实上,我怀疑这样的事情,但无法克服这样的事实:append
和+=
在逻辑上做相同的事情(更改现有对象)。我将在下面发布解决方案。
def cb_append_result(t):
global results
results += [t]
y = []
# doesn't work
def f(x):
y += [x]
# works
def g(x):
global y # <===== Answer!!
y += [x]
# works
def h(x):
y.append(x)
# f(1) # local variable 'y' referenced before assignment
g(1) # works
print(y)
h(2) # works
print(y)
[1]
[1, 2]