Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在函数内部但在子函数外部访问var_Python - Fatal编程技术网

Python 如何在函数内部但在子函数外部访问var

Python 如何在函数内部但在子函数外部访问var,python,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] p

我有以下函数,其中包括一个函数:

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()
但是,我无法访问以前解析的
电视URL
。我如何从
\u get\u all\u相关的
功能中访问它

以下是我当前遇到的错误:

UnboundLocalError: local variable 'previously_parsed_tv_urls' referenced before assignment

如果您想引用早期定义的名称,即使是在“更高”的范围内,Python通常也可以使用它。这会给你各种各样的权力,特别是当你只是在一个口译员里胡闹的时候

然而,Python也非常慷慨地试图阻止您做可能会伤害您或导致严重、难以调试的问题的事情。这就是
UnboundLocalError
的作用

一旦在特定范围内重新定义名称,Python就会将其标记为该范围的本地名称(仅限于此),并且不会查找更高的值。这样可以避免在没有明确请求的情况下意外地破坏更高的作用域


正如Andrea Corbellini提到的,Python3添加了允许您发出这样一个显式请求的命令。非常详尽地描述了这种允许的范围规则的变化,与不使用
非本地
的Python以及其他同类通用语言进行了比较。

您将在内部函数中分配给
以前解析的\u tv\u URL
。当您这样做时,Python总是将其作为整个函数的本地名称;因此,您先前对该值的访问将失败,并出现您看到的错误

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

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

为什么您认为您无法访问以前解析的
电视URL
?看起来你确实应该这样做。你发布的代码不能产生那个错误。@coderhacker它被称为闭包。这是一种非常常见的设计模式。@David542现在您正在调用
函数
中的
函数
,错误消息为
“先前请求的\u tv\u URL”
而不是
“先前解析的\u tv\u URL”
,因此我敢打赌您还有其他问题。能否请您再次检查您发布的代码,以确保它与您的实际代码相匹配?@David542大胆猜测:Python可以访问范围更高的东西(一直到全局),只要它们没有重新声明。如果在函数中重新声明该名称,则将其设置为本地名称,Python将引发
UnboundLocalError
投诉。