【问题标题】:Difference between `.append` and `+=` when used inside functions [duplicate]在函数内部使用时`.append`和`+=`之间的区别[重复]
【发布时间】:2018-01-27 20:58:26
【问题描述】:

我试图了解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]    

【问题讨论】:

  • 是的——就是这样!事实上,我怀疑有这样的事情,但无法忘记append+= 在逻辑上做同样的事情(更改现有对象)的事实。我将在下面发布解决方案。

标签: python multiprocessing


【解决方案1】:

该解决方案实际上与多处理或回调无关。关键是使用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]

所以事实上,callback 业务等都被混淆了。我已经编辑了我的原始帖子。

【讨论】:

    猜你喜欢
    • 2013-11-06
    • 2022-01-14
    • 2014-12-07
    • 1970-01-01
    • 2020-03-05
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多