我最近在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。