__name __ =“ __ main__”里面或外面有什么不同?

时间:2019-11-17 15:42:15

标签: python multiprocessing

很高兴认识您,让我先为您展示一个简化的代码

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__()))

它正常工作。 为什么会这样?

1 个答案:

答案 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!')