很高兴认识您,让我先为您展示一个简化的代码
from multiprocessing import Pool
AAA = []
def input_list():
with open('./AAA.tsv') as f:
for line in f:
AAA.append(line[:9])
return AAA
def printf(number):
print(AAA)
if __name__ == '__main__':
input_list()
pool = Pool(processes=1)
pool.map(printf, range(0, AAA.__len__()))
完成后,由于input_list而执行的AAA将为 在printf方法中无法识别。
但是,如果您在外部声明input_list(),
from multiprocessing import Pool
AAA = []
def input_list():
with open('./AAA.tsv') as f:
for line in f:
AAA.append(line[:9])
return AAA
def printf(number):
print(AAA)
input_list()
if __name__ == '__main__':
pool = Pool(processes=1)
pool.map(printf, range(0, AAA.__len__()))
它正常工作。 为什么会这样?
答案 0 :(得分:1)
正如@jonrsharpe发布的链接所提到的那样,python中的if __name__ == '__main__':
旨在使if
块的内容仅在模块直接执行时才运行,而不能作为模块的一部分读取import
语句(即,该模块被编写为用作库)。
如果您习惯使用C / C ++ / Java,则可能习惯于main()
作为程序的绝对入口点。那不是在Python中的工作方式。在这方面,Python在行为上更类似于Bash或其他所谓的“脚本”语言:当您从命令行运行程序时(例如,通过键入./my_prog.py
),Python解释器会从中读取整个文件从上到下,并依次执行每个语句。
因此,在直接运行程序的情况下,放置在if
块中的内容与外部内容无关紧要。只要这些语句具有相同的顺序,并且程序的逻辑相同,它们将以相同的顺序运行并产生相同的行为。
还要注意,当我们说解释器“顺序运行每个语句”时,这并不一定意味着每个语句都将立即执行。例如,属于def my_func():
块范围内的任何内容都将被视为该函数定义的一部分,并且仅在以后调用该函数时才运行。
还请注意,这可能会影响您定义和使用变量/函数或任何对象的顺序。必须先定义事物,然后才能使用它们,因此这将不起作用:
x()
def x():
print('hello, world!')