我最近在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
不起作用?
答案 0 :(得分:1)
我已尝试解决您的问题,这就是我遇到的问题:
注意对dict和列表代理中的可变值或项的修改不会通过管理器传播,因为代理无法知道何时修改其值或项。要修改此类项,可以将修改后的对象重新分配给容器代理:
所以看起来这不是数据结构本身的问题,而是管理它。所以,我已根据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)
给我以下结果:
$ 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
进行分配时,不会发生任何更改,因此需要一个解决方法或替代方法。