Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “.append”和“+;”之间的差异在函数内部使用时_Python_Multiprocessing - Fatal编程技术网

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]