Python 2x嵌套函数中的访问列表

Python 2x嵌套函数中的访问列表,python,python-3.x,Python,Python 3.x,如何访问parse_movie中嵌套在parse_main中的movies列表(在main()函数中定义)。由于“未解析的引用“电影”错误,无法将任何内容附加到列表。使用非局部变量没有帮助电影是主函数中的局部变量,因此函数找不到它是正常的,要么将其设置为全局变量(不总是一个好主意),要么将其作为参数传递。电影是主函数中的局部变量,因此函数找不到它是正常的,要么将其设置为全局变量(不一定是个好主意)或将其作为参数传递。将movies列表作为参数传递,并避免使用全局变量,在大多数情况下这会更好 问题

如何访问parse_movie中嵌套在parse_main中的movies列表(在main()函数中定义)。由于“未解析的引用“电影”错误,无法将任何内容附加到列表。使用非局部变量没有帮助

电影是主函数中的局部变量,因此函数找不到它是正常的,要么将其设置为全局变量(不总是一个好主意),要么将其作为参数传递。

电影是主函数中的局部变量,因此函数找不到它是正常的,要么将其设置为全局变量(不一定是个好主意)或将其作为参数传递。

movies
列表作为参数传递,并避免使用全局变量,在大多数情况下这会更好

问题在于
movies
是̀
parse_movie
中的一个局部变量,这意味着它与
main
中定义的变量不同

我只是将̀
movies
变量从
main
函数传递到
parse_movie
函数,并添加了
return
语句

def get_html(url):
    response = urllib.request.urlopen(url)
    return response.read()


def parse_main(html):
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href']))


def parse_movie(html):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    movies.append(info.text)


def main():
    movies = []
    parse_main(get_html('https://www.somerandommovieswebsite.com'))
    print(movies)


if __name__ == '__main__':
    main()

movies
列表作为参数传递,并避免使用全局变量,在大多数情况下这样更好

问题在于
movies
是̀
parse_movie
中的一个局部变量,这意味着它与
main
中定义的变量不同

我只是将̀
movies
变量从
main
函数传递到
parse_movie
函数,并添加了
return
语句

def get_html(url):
    response = urllib.request.urlopen(url)
    return response.read()


def parse_main(html):
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href']))


def parse_movie(html):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    movies.append(info.text)


def main():
    movies = []
    parse_main(get_html('https://www.somerandommovieswebsite.com'))
    print(movies)


if __name__ == '__main__':
    main()
我认为您不应该在这里使用全局变量,也不应该将其作为参数传递:

def get_html(url):
    response = urllib.request.urlopen(url)
    return response.read()


def parse_main(html):
    movies = []
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        movies.append(parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href'])))
    return movies


def parse_movie(html):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    return info.text


def main():
    movies = parse_main(get_html('https://www.somerandommovieswebsite.com'))
    print(movies)


if __name__ == '__main__':
    main()
我认为您不应该在这里使用全局变量,也不应该将其作为参数传递:

def get_html(url):
    response = urllib.request.urlopen(url)
    return response.read()


def parse_main(html):
    movies = []
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        movies.append(parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href'])))
    return movies


def parse_movie(html):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    return info.text


def main():
    movies = parse_main(get_html('https://www.somerandommovieswebsite.com'))
    print(movies)


if __name__ == '__main__':
    main()

最简单的方法是使用全局变量。但您应该尽可能避免使用全局变量。您可以这样更改代码,避免使用全局变量并将变量作为参数传递

def get_html(url):
    response = urllib.request.urlopen(url)
    return response.read()


def parse_main(html):
    movies = []
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        movies.append(
            parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href']))
        )
    return movies


def parse_movie(html):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    return info.text


def main():
    movies = parse_main(get_html('https://www.somerandommovieswebsite.com'))
    print(movies)


if __name__ == '__main__':
    main()

最简单的方法是使用全局变量。但您应该尽可能避免使用全局变量。您可以这样更改代码,避免使用全局变量并将变量作为参数传递

def get_html(url):
    response = urllib.request.urlopen(url)
    return response.read()


def parse_main(html):
    movies = []
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        movies.append(
            parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href']))
        )
    return movies


def parse_movie(html):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    return info.text


def main():
    movies = parse_main(get_html('https://www.somerandommovieswebsite.com'))
    print(movies)


if __name__ == '__main__':
    main()

有几种方法可以做到这一点

首先定义全球电影。

第二步,您可以将列表作为这样的参数传递。

由于列表是通过引用传递的,我们在主函数中添加了定义的列表,因此不需要返回到主函数

def get_html(url):
    response = urllib.request.urlopen(url)
    return response.read()


def parse_main(html):
    parse_movies = []
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        parse_movies.append(parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href'])))
    return movies


def parse_movie(html):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    return info.text


def main():
    movies = parse_main(get_html('https://www.somerandommovieswebsite.com'))
    print(movies)


if __name__ == '__main__':
    main()
第三种方法是在函数中创建一个列表并返回它

def parse_main(html,movies):
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href']),movies)


def parse_movie(html,movies):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    movies.append(info.text)


def main():
    movies = []
    parse_main(get_html('https://www.somerandommovieswebsite.com'),movies)
    print(movies)

有几种方法可以做到这一点

首先定义全球电影。

第二步,您可以将列表作为这样的参数传递。

由于列表是通过引用传递的,我们在主函数中添加了定义的列表,因此不需要返回到主函数

def get_html(url):
    response = urllib.request.urlopen(url)
    return response.read()


def parse_main(html):
    parse_movies = []
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        parse_movies.append(parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href'])))
    return movies


def parse_movie(html):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    return info.text


def main():
    movies = parse_main(get_html('https://www.somerandommovieswebsite.com'))
    print(movies)


if __name__ == '__main__':
    main()
第三种方法是在函数中创建一个列表并返回它

def parse_main(html,movies):
    webpage = BeautifulSoup(html, features="html.parser")
    table = webpage.find('table', id='itemList')

    for a_tag in table.find_all('a', class_='all'):
        parse_movie(get_html('https://www.somerandommovieswebsite.com' + a_tag['href']),movies)


def parse_movie(html,movies):
    web_page = BeautifulSoup(html, features="html.parser")
    info = web_page.find('h1', class_="moviename")
    movies.append(info.text)


def main():
    movies = []
    parse_main(get_html('https://www.somerandommovieswebsite.com'),movies)
    print(movies)