Python 3.x 在'main'模块中运行时发生名称错误

Python 3.x 在'main'模块中运行时发生名称错误,python-3.x,Python 3.x,我试图在文件中递归地获取所有.md文件。为了完成它,我定义了一个递归函数,该函数在主模块中运行 守则: import os def walk(dirname): for name in os.listdir(dirname): path = os.path.join(dirname, name) if os.path.isfile(path): if '.md' in path: path_list.

我试图在文件中递归地获取所有
.md
文件。为了完成它,我定义了一个递归函数,该函数在
模块中运行

守则:

import os
def walk(dirname):
    for name in os.listdir(dirname):
        path = os.path.join(dirname, name)
        if os.path.isfile(path):
            if '.md' in path:
                path_list.append(path)
        else:
            walk(path)
    return path_list
def main():
    dir = '/Users/Documents/Diary'
    path_list = []
    path = walk(dir)

if __name__ == '__main__':
    main()
运行时,它会报告:

NameError: name 'path_list' is not defined
但是,如果在不使用
main()
的情况下运行,它会工作:

In [80]: path_list = []
    ...: def walk(dirname):
    ...:     for name in os.listdir(dirname):
    ...:         path = os.path.join(dirname, name)
    ...:         if os.path.isfile(path):
    ...:             if '.md' in path:
    ...:                 path_list.append(path)
    ...:         else:
    ...:             walk(path)
    ...:     return path_list
输出:

dir = '/Users/Documents/Diary'
walk(dir)
Out[81]:
['/Users/Documents/Diary/py4.1.If_statements.md',
 '/Users/Documents/Diary/pyName_and_object:.md',
 ...]

我不知道是什么错误。

您的第二个选项将
path\u list
声明为全局变量,因此它在所有函数中都是已知的

您还可以在
walk()
函数中声明它,这是唯一需要它的地方。但是,正如所评论的,由于该函数是递归调用的,因此每次都会重置列表,而不是聚合结果

请参阅“”中的更多内容

全局变量可在函数内部和外部访问。
局部变量只能在函数内部访问。
如果我在一个函数中设置了一个与全局变量同名的变量,我实际上是在创建一个新的局部变量


第二个选项将
path\u list
声明为全局变量,因此它在所有函数中都是已知的

您还可以在
walk()
函数中声明它,这是唯一需要它的地方。但是,正如所评论的,由于该函数是递归调用的,因此每次都会重置列表,而不是聚合结果

请参阅“”中的更多内容

全局变量可在函数内部和外部访问。
局部变量只能在函数内部访问。
如果我在一个函数中设置了一个与全局变量同名的变量,我实际上是在创建一个新的局部变量


这里的问题是对象的范围

创建
main()
函数时,您正在
main()
的本地范围内声明
path\u list
。因此,它不可用于
walk()
函数


您必须将
path\u list
作为参数传递,才能遍历或全局声明它,就像后者一样,以使其可用。截至目前,
path\u list
超出了
walk()

的范围,这里的问题是对象的范围

创建
main()
函数时,您正在
main()
的本地范围内声明
path\u list
。因此,它不可用于
walk()
函数


您必须将
path\u list
作为参数传递,才能遍历或全局声明它,就像后者一样,以使其可用。目前,
path\u list
不在
walk()

的范围内,您需要在
walk
函数中声明
path\u list
,因为它是在其上操作的函数。您得到一个错误,因为您没有在该函数中预先声明任何
路径列表

此外,您不需要在main函数中定义任何
path\u list
,因为它不在其上操作,也不需要它


当您全局声明它时,它可用于所有函数,甚至是
walk
函数。它使用该全局变量,不会出现任何错误。

您需要在
walk
函数中声明
path\u list
,因为它是对其进行操作的函数。您得到一个错误,因为您没有在该函数中预先声明任何
路径列表

此外,您不需要在main函数中定义任何
path\u list
,因为它不在其上操作,也不需要它


当您全局声明它时,它可用于所有函数,甚至是
walk
函数。它使用该全局变量,并且不会出现任何错误。

如何在walk()函数中声明它?当遇到嵌套目录时,
def walk():path_list=[]
。每次递归调用path_list时,它的值都会被清除。如果为True,那么全局声明就足够了。如何在walk()函数中声明它?当遇到嵌套目录时,
def walk():path_list=[]
。path_list的值将在每次递归调用时被清除。如果是这样,那么全局声明会给人留下深刻印象,无法相信您的声誉是1:-谢谢,很乐意帮助!:)令人印象深刻,不敢相信你的声誉是1:-谢谢,很高兴帮助你!:)