Почему я не могу перебрать список (многопроцессорных) менеджеров?

У меня есть массив, состоящий из списков менеджера, таких как:

[<ListProxy object, typeid 'list' at 0x177d350>, <ListProxy object, typeid 'list' at 0x177d390>, ...]

и попытаться преобразовать его в чистый список. Мое рассмотрение выглядит так:

y=[]
for i in my_manager_list_content:
    for j in i:
        y.append(float(j))
print y #This works

print [next(iter(i[:]))  for i in my_manager_list_content] #Why doesn't this work?

Как я мог сделать это в oneliner?

1 ответ

Объяснение того, почему ваши коды не работают. iter() берет итеративный объект и возвращает интегратор. next() берет итератор и возвращает следующий элемент. В вашем коде, когда вы берете элемент из вашего my_manager_list_content, вы получаете только первый элемент из этого с next а затем вы переходите на второй элемент my_manager_list_content, Это можно проиллюстрировать следующими кодами: (расширение решения @Kevin Guan)

from multiprocessing import Process, Manager

def f(ll, l):
    for ii in range(3):
        ll.append(l)

if __name__ == '__main__':
    with Manager() as manager:
        ll = manager.list()
        l = manager.list(range(3))
        p = Process(target=f, args=(ll, l))
        p.start()
        p.join()

        print([float(ii) for jj in ll for ii in jj])
        print([next(iter(ii)) for ii in ll])

И я получаю

[0.0, 1.0, 2.0, 0.0, 1.0, 2.0, 0.0, 1.0, 2.0]
[0, 0, 0]
Другие вопросы по тегам