【发布时间】:2020-06-19 16:34:19
【问题描述】:
我想通过 array(a).tolist() 更改多处理子进程中的 manager.list。在子流程中添加列表有效,但使用该方法更改无效。
任何提示什么是错的?非常感谢。
from multiprocessing import Process, Manager
import numpy as np
def f(lst, lst1):
lst.append([2])
a = np.array([[8],[9]])
lst1 = np.array(a).tolist()
print('lst1: ', lst1)
if __name__ == '__main__':
manager = Manager()
lst = manager.list()
lst.append([1])
print('lst main before: ', lst)
lst1 = manager.list()
lst1.append([7])
print('lst1 main before: ', lst1)
p = Process(target=f, args=(lst,lst1))
p.start()
p.join()
print('lst main after: ', lst)
print('lst1 main after: ', lst1)
输出:
lst main before: [[1]]
lst1 main before: [[7]]
lst1: [[8], [9]]
lst main after: [[1], [2]]
lst1 main after: [[7]]
【问题讨论】:
-
np.ndarray.tolist创建一个list,而不是manager.list我不太确定你在这里期待什么 -
因为 lst1 在 main 中被定义为 manager.list 我希望函数 def f 中 lst1 的变化会改变 main 中的 lst1。它与 lst 中的 append 一起使用。显然不是...有没有办法可以将进程中的数组或列表返回给 main?
-
lst1 = np.array(a).tolist()永远不会更改托管列表。变量赋值不是 Python 中的数据副本。您刚刚更改了lst1局部变量所指的对象。
标签: python arrays multiprocessing tolist