更改多处理列表



我最近在Python 2.7中遇到了一种奇怪的行为。

>>> import multiprocessing as mp
>>> lst = mp.Manager().list()
>>> lst.append([1,2])
>>> lst.append([3,4])
>>> print(lst)
[[1, 2], [3, 4]]
>>> lst[0][1] = 123
>>> print(lst)
[[1, 2], [3, 4]]     

嗯?为什么多处理列表的第一个元素没有更改?它可以与普通列表一起工作!

让我们以不同的方式尝试。

>>> lst[0] = [1,123]
>>> print(lst)
[[1, 123], [3, 4]]

好吧,至少我有解决方法。但是,为什么第一个片段中的评估lst[0][1] = 123不起作用?

我尝试在您的问题上工作,这就是我遇到的内容:

注意对dict和列表代理中的可变值或项目的修改将不会通过经理传播,因为代理无法知道何时修改其值或项目。要修改此项目,您可以将修改的对象重新分配给容器代理:

感谢这个问题。

因此,似乎与数据结构本身有关,而是管理它并不重要。因此,我根据文档创建了一个过程:

import multiprocessing as mp
def targ(*args, **kwargs):
  print('Args: {}'.format(args[0]))
  args[0][0].pop()
  args[0][0].append(123)
  print('Args: {}'.format(args[0]))
manager = mp.Manager()
lst = manager.list()
lst.append([1, 2])
lst.append([3, 4])
print(lst)
proc = mp.Process(target=targ, args=(lst,))
proc.start()
proc.join()
print(lst)

给我以下结果:

$ python3 main.py 
[[1, 2], [3, 4]]
Args: [[1, 2], [3, 4]]
Args: [[1, 123], [3, 4]]
[[1, 123], [3, 4]]

当我尝试使用args[0][0][1] = 123进行讨论时,没有发生任何更改,因此需要一个解决方法或Antoher。

相关内容

  • 没有找到相关文章

最新更新