Python Can';t将一个局部变量变为另一个函数中的一个函数

Python Can';t将一个局部变量变为另一个函数中的一个函数,python,Python,我试图在另一个函数中操作dictionary clean_txt中的列表,但它不起作用,我最终在dict中得到了空列表 我的理解是列表和dict都是可变对象,那么这里的问题是什么 def process_questions(i, question_list, questions, question_list_name): ''' Transform questions and display progress ''' print('processing {}: process {

我试图在另一个函数中操作dictionary clean_txt中的列表,但它不起作用,我最终在dict中得到了空列表

我的理解是列表和dict都是可变对象,那么这里的问题是什么

def process_questions(i, question_list, questions, question_list_name):
    ''' Transform questions and display progress '''
    print('processing {}: process {}'.format(question_list_name, i))
    for question in questions:
        question_list.append(text_to_wordlist(str(question)))

@timeit
def multi(n_cores, tq, qln):
    procs = []
    clean_txt = {}
    for i in range(n_cores):
        clean_txt[i] = []

    for index in range(n_cores):
        tq_indexed = tq[index*len(tq)//n_cores:(index+1)*len(tq)//n_cores]
        proc = Process(target=process_questions, args=(index, clean_txt[index], tq_indexed, qln, ))
        procs.append(proc)
        proc.start()

    for proc in procs:
        proc.join()

    print('{} records processed from {}'.format(sum([len(x) for x in clean_txt.values()]), qln))
    print('-'*100)

您使用的是进程而不是线程

创建进程时,会复制程序的内存,并且每个进程都在自己的集合中工作,因此它不是共享的

这里有一个问题可以帮助您理解:


如果您想在进程之间共享内存,您应该查看或使用。还有其他共享数据的解决方案,如队列或数据库等。

您使用的是进程而不是线程

创建进程时,会复制程序的内存,并且每个进程都在自己的集合中工作,因此它不是共享的

这里有一个问题可以帮助您理解:


如果您想在进程之间共享内存,您应该查看或使用。还有其他共享数据的解决方案,如队列或数据库等。

您将从另一个进程附加到
clean_txt[index]
clean_txt[index]
属于创建它的主要python进程。由于一个进程不能访问或修改另一个进程的内存,因此您不能附加到它。(并非如此。请参见下面的编辑)

您需要创建共享内存

您可以使用
Manager
创建共享内存,类似这样

from multiprocessing import Manager
manager = Manager()
...
    clean_txt[i] = manager.list()
现在,您可以在另一个进程中附加到此列表

编辑-

我对
clean_txt
的解释不清楚。感谢@Maresh


当创建一个新的
进程时,将复制整个内存。因此,在新进程中修改列表不会影响主进程中的副本。因此,您需要一个共享内存。

您将从另一个进程附加到
clean_txt[index]
clean_txt[index]
属于创建它的主要python进程。由于一个进程不能访问或修改另一个进程的内存,因此您不能附加到它。(并非如此。请参见下面的编辑)

您需要创建共享内存

您可以使用
Manager
创建共享内存,类似这样

from multiprocessing import Manager
manager = Manager()
...
    clean_txt[i] = manager.list()
现在,您可以在另一个进程中附加到此列表

编辑-

我对
clean_txt
的解释不清楚。感谢@Maresh


当创建一个新的
进程时,将复制整个内存。因此,在新进程中修改列表不会影响主进程中的副本。所以你需要一个共享内存。

说它属于父进程有点误导:)@Maresh他在主进程中执行
clean_txt[i]=[]
,所以列表将属于主进程,对吗?每个进程都有自己的内存空间,从父进程的“one”复制过来,在使用多处理时,了解这一点很重要。最后你是对的,这个确切的内存地址属于父内存地址,但在解释中应该更清楚。@Maresh Ok。现在我明白了。感谢您的澄清。:)@shreyash-s-sarnayak它工作了,但我的运行时间增加了一倍说它属于父进程有点误导:)@Maresh他在主进程中执行
clean_txt[i]=[]
,所以列表将属于主进程,对吗?每个进程都有自己的内存空间,从父进程的一个复制而来,在使用多处理时,了解这一点很重要。最后你是对的,这个确切的内存地址属于父内存地址,但在解释中应该更清楚。@Maresh Ok。现在我明白了。感谢您的澄清。:)@shreyash-s-sarnayak它起作用了,但我的运行时间增加了一倍