gpt4 book ai didi

python - 多处理:在某些情况下在赋值之前引用变量,但在其他情况下则不会

转载 作者:太空宇宙 更新时间:2023-11-03 13:49:54 26 4
gpt4 key购买 nike

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

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'

为什么我不能这样做?

最佳答案

如果一个变量被赋值给函数中的任何地方,它就被视为局部变量。 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[...] = ...),尽管它们看起来很相似。

请注意,顺便说一句,该错误与多处理无关。

关于python - 多处理:在某些情况下在赋值之前引用变量,但在其他情况下则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11442477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com