如何在函数内但在子函数外

时间:2015-10-02 20:34:36

标签: python

我有以下功能,其中包含一个功能:

def function():
    previously_parsed_tv_urls = set()

    def _get_all_related(tv_urls):

        api_urls = [self._build_api_url_from_store_url(url)
                    for url in tv_urls not in previously_parsed_tv_urls]
        previously_parsed_tv_urls = tv_urls.union(api_urls)


    function()

但是,我无法访问previously_parsed_tv_urls。我如何从_get_all_related函数中访问它?

这是我目前得到的错误:

UnboundLocalError: local variable 'previously_parsed_tv_urls' referenced before assignment

2 个答案:

答案 0 :(得分:3)

如果要引用先前定义的名称,即使在“更高”的范围内,Python通常也可以使用它。这会给你各种各样的力量,特别是当你只是在翻译中乱搞时。

然而,Python也非常慷慨地试图阻止你做一些可以咬你或导致令人讨厌,难以调试的问题。这是UnboundLocalError的用武之地。

只要在特定范围内重新定义名称,Python就会将其标记为该范围的本地(仅限),并且不会看起来更高以提供值。这可以防止您在没有明确请求的情况下意外地破坏更高的范围。

正如Andrea Corbellini所说,Python 3添加了nonlocal keyword以允许您发出这样一个明确的请求。 PEP 3104非常详尽地描述了这种允许的范围规则的变化,比较了没有nonlocal的Python以及其他常见语言。

答案 1 :(得分:3)

您在内部函数内部分配previously_parsed_tv_urls。当你这样做时,Python总是在整个函数中使它成为本地名称;因此,您之前对该值的访问将因您看到的错误而失败。

然而,在这种情况下,似乎没有任何理由重新分配名称。相反,您可以更新现有的集合:

all_urls = tv_urls.union(api_urls)
previously_parsed_tv_urls.update(all_urls)