2017-06-26 52 views
0

我最近在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不起作用?

回答

1

我试着在你的问题的工作,这里是我所遇到过:

注意修改到可变值或项字典和列表代理不会通过管理器来传播,因为代理无法知道其值或项目何时被修改。要修改这样的项目,您可以将修改的对象重新分配给容器代理:

感谢this question

所以它似乎不是数据结构本身的问题,而是管理它。所以,我根据the docs创建一个过程:

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) 

给予我下面的结果:当我试着args[0][0][1] = 123这样一个解决方法或antoher将是必要的assiging

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

没有变化occureed 。

+0

当我现在考虑它时,这是有道理的。谢谢! –