2017-06-26 78 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

當我現在考慮它時,這是有道理的。謝謝! –