python - 在函数内部使用时 `.append` 和 `+=` 之间的区别

标签 python multiprocessing

<分区>

我试图了解 Pool.apply_async 中的 callback 函数是如何工作的,但遇到了以下问题。在回调之外,我定义了

results = []

并希望在值可用时使用回调将工作进程的返回值附加到 results

不过,奇怪的是这个语句(在回调中)有效:

results.append(t)

但是

results += [t]

报告未分配的引用错误。

这是怎么回事?任何见解将不胜感激!

完整代码如下:

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)

输出:

[1]
[1, 2]

所以实际上,回调 业务等都是混淆的。我已经编辑了我的原始帖子。

关于python - 在函数内部使用时 `.append` 和 `+=` 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48480501/

相关文章:

python-3.x - 这个错误: "PermissionError: [WinError 5] Access is denied"的原因是什么

python - 多处理:如何在列表上使用 pool.map 并使用参数函数?

python - Elastic Beanstalk 中的导入错误 : No module named django. core.wsgi

Python 日期字符串 mm/dd/yyyy 转日期时间

python - 由于 ssl 错误,无法在 python 3.6 中 pip 安装包

具有默认值的 python 字典 .get() 方法抛出异常,即使它甚至不应该被执行

python - 为什么多处理的 apply_async 如此挑剔?

python - pytorch 中 expand 的 numpy 等价物是什么?

Python-多处理守护进程

python - 使用多处理搜索列表