代码之家  ›  专栏  ›  技术社区  ›  Donna

“”之间的差异。在函数内使用append`和'+=`时[重复]

  •  2
  • Donna  · 技术社区  · 7 年前

    我想了解 callback 中的函数 Pool.apply_async 工作,并遇到以下问题。在回调之外,我定义

    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]    
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Donna    7 年前

    该解决方案实际上与多处理或回调无关。关键是使用 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 生意等都搞糊涂了。我已经编辑了我原来的帖子。