我有以下功能,其中包含一个功能:
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
答案 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)