【问题标题】:multiprocessing: variable being referenced before assignment in some cases but not others多处理:在某些情况下,在分配之前引用变量,但在其他情况下不引用
【发布时间】:2012-07-11 15:37:21
【问题描述】:

我在这个网站的某个地方找到了以下示例:

import multiprocessing
import ctypes
import numpy as np

shared_array_base = multiprocessing.Array(ctypes.c_double, 10*10)
shared_array = np.ctypeslib.as_array(shared_array_base.get_obj())
shared_array = shared_array.reshape(10, 10)

# No copy was made
assert shared_array.base.base is shared_array_base.get_obj()

# Parallel processing
def my_func(i, def_param=shared_array):
    shared_array[i,:] = i

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    pool.map(my_func, range(10))

    print shared_array

上面的代码工作正常,但是如果我想向共享数组添加一个数组,比如 shared_array += some_other_array (而不是上面的 shared_array[i,;] = i)我得到了

赋值前引用的局部变量“shared_array”

任何想法为什么我不能这样做?

【问题讨论】:

    标签: python python-2.7 multiprocessing


    【解决方案1】:

    如果将变量分配给函数中的任何位置,则将其视为局部变量。 shared_array += some_other_array 等价于 shared_array = shared_array + some_other_array。因此shared_array 被视为局部变量,在您尝试在赋值右侧使用它时它并不存在。

    如果您想使用全局 shared_array 变量,您需要通过在您的函数中放置 global shared_array 来将其显式标记为全局变量。

    您看不到shared_array[i,:] = i 错误的原因是它没有分配给变量shared_array。相反,它改变了该对象,分配给它的一部分。在 Python 中,分配给一个裸名(例如,shared_array = ...)与任何其他类型的分配(例如,shared_array[...] = ...)非常不同,尽管它们看起来很相似。

    请注意,该错误与多处理无关。

    【讨论】:

    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2019-01-29
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多