问题标签 [python-nonlocal]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2429 浏览

python - Python 3从另一个函数更改函数中的变量

我想从 testadder 访问 main 中的 testing 变量,以便在 main 中调用 testadder 后它将为 test 添加 1。

出于某种原因,我可以通过这种方式将 1 添加到列表中,但不能添加变量。nonlocal 声明不起作用,因为函数没有嵌套。

有没有办法解决这个问题?

0 投票
1 回答
1729 浏览

python - 尝试在 for 循环之外使用变量会出现 SyntaxError: no binding for nonlocal 'max_' found

我想在循环外使用max_,但出现错误temp_

0 投票
1 回答
263 浏览

scope - 在 Python 3 中使用导入的模块时出现范围错误

我从之前创建的单独文件中导入了一个函数。在其中我将变量声明numsnonlocal,然后使用它。因此,在这种情况下,我会给你一段我的代码和我的错误。

opening_questions()我声明nonlocal nums 并尝试nums在我的函数内部使用。这是我得到的错误:

在我从一个单独的文件运行它之前,这段代码运行得很好。我需要什么才能使此代码正常工作? 我正在使用 python 3.5 - 如果您需要澄清,请询问。

0 投票
3 回答
3118 浏览

python - 外部函数中的嵌套函数更改变量不起作用

输出 的值a。但是,如果我想像这样更改a嵌套函数:

它引发了UnboundLocalError异常。

我知道a是一个非局部变量,但为什么我可以在不声明的情况下访问它nonlocal a

0 投票
2 回答
56 浏览

python - 在列表上使用 += 时出现 UnboundLocalError。为什么直接调用 __iadd__ 时这里需要 `nonlocal` 可以正常工作?

考虑这段代码:

它将产生:

这本身可以通过nonlocal l在开头使用func __iadd__直接使用而不是来解决+=

问题:这里为什么nonlocal需要?

这对我来说非常令人惊讶。

0 投票
1 回答
109 浏览

python - 非本地关键字如何工作?

在下面的代码中,

python 解释器不series希望nonlocalaverage().

但是在下面的代码中

问题:

为什么 python 解释器期望count&在中total声明?nonlocalaverage()

0 投票
0 回答
53 浏览

python - 如何使用 Python 的 code.interact 获得完整的命名空间?

例如,在 Python (v. 3.6) 中执行 code.interact 时,如何访问完整的命名空间,包括非本地名称?

通常建议使用以下解决方案或类似的解决方案:

code.interact(local={**globals(), **locals()})

但是,这不提供非本地名称(从内部函数看到的外部函数的名称)。事实上,即使是内置函数 dir() 在这方面似乎也很有趣:

在上面的代码中,名称 x 对 dir() 是不可见的,但如果 print(x) 行未注释,则它是可见的。有趣的是 dir() 的语义应该如何取决于它之后发生的事情?!(这是优化还是错误或什么?)那么有没有办法获得所有非本地名称而无需先访问它们?

我宁愿不必编写自己的函数(使用检查或其他)。

0 投票
0 回答
65 浏览

function - 将在函数(特定类下)下定义的变量传播到同一类下的其他函数

我有一个代码,其中几乎没有类。在 下SecondClass,有一个函数叫做plot_image。在这个函数下,定义了三个变量my_x, my_y, my_z。我试图使这些变量在同一个类中调用的其他一些函数中可访问。这是一个伪代码段形式的非工作示例:get_histogram

global我尝试了函数顶部的关键字,plot_image但这并没有为我提供错误信息:

“NameError:名称‘my_x’未定义。”

解决办法是什么?

0 投票
0 回答
261 浏览

python - 在非本地范围内使用变量类型注释作为占位符?

由于PEP 526 -- 变量注释的语法被批准,在 Python 3.6+ 中,可以在表单中提供类型提示信息,x: intPEP 也说“但是,注释局部变量将导致解释器始终使其成为本地变量范围并使变量未初始化”。因此,在 Python 3.6+ 中,这样写在语法上是合法的:

而上面的代码片段在语义上更等同于:

这显然是一个SyntaxError: no binding for nonlocal 'x' found,对不起双关语。在 PEP 8 和 Python 3.6 文档中也没有提到这种风格。

那么我应该将其视为错误、实现细节(副作用)、缺陷还是功能?

在网上搜索了一番后,我发现这个效果已经在 stdlib 中使用了——typing.NamedTuple但实际上类体不是作用域,而且这种效果似乎在 Python 3.7 中被利用了@dataclasses。这种情况真的让我吃惊,事实证明有些事情离不开type annotations,而它们的唯一目的是提供类型提示而没有任何运行时或编译时影响。

相对nonlocal部分,这个问题非常接近:

  1. 何时检查非局部变量的存在?
  2. 访问在封闭范围中定义的变量

从这个角度来看,它是可以关闭的。事实上,我们无法达成共识,如果我们选择在我们的代码库中使用这种形式,我想听听您对可能存在的陷阱的看法。

0 投票
2 回答
781 浏览

python - Python:从外部函数返回后修改非局部变量

考虑以下示例:

内部函数f1f2都在其“闭包”中访问变量in_g。但是,g返回后,在in_g内存中保存在哪里?

我假设在g执行时,in_g是堆栈帧上的一个变量,对应于对g. 因此,gf1f2在使用变量时访问相同的内存位置(在堆栈上)in_g

但是,如示例中所见,在g返回之后f1f2在引用in_g. 但是,现在g返回了,该内存位置不能再在堆栈上。