问题标签 [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.
python - Python 3从另一个函数更改函数中的变量
我想从 testadder 访问 main 中的 testing 变量,以便在 main 中调用 testadder 后它将为 test 添加 1。
出于某种原因,我可以通过这种方式将 1 添加到列表中,但不能添加变量。nonlocal 声明不起作用,因为函数没有嵌套。
有没有办法解决这个问题?
python - 尝试在 for 循环之外使用变量会出现 SyntaxError: no binding for nonlocal 'max_' found
我想在循环外使用max_
,但出现错误temp_
scope - 在 Python 3 中使用导入的模块时出现范围错误
我从之前创建的单独文件中导入了一个函数。在其中我将变量声明nums
为nonlocal
,然后使用它。因此,在这种情况下,我会给你一段我的代码和我的错误。
在opening_questions()
我声明nonlocal nums
并尝试nums
在我的函数内部使用。这是我得到的错误:
在我从一个单独的文件运行它之前,这段代码运行得很好。我需要什么才能使此代码正常工作? 我正在使用 python 3.5 - 如果您需要澄清,请询问。
python - 外部函数中的嵌套函数更改变量不起作用
输出 的值a
。但是,如果我想像这样更改a
嵌套函数:
它引发了UnboundLocalError
异常。
我知道a
是一个非局部变量,但为什么我可以在不声明的情况下访问它nonlocal a
?
python - 在列表上使用 += 时出现 UnboundLocalError。为什么直接调用 __iadd__ 时这里需要 `nonlocal` 可以正常工作?
考虑这段代码:
它将产生:
这本身可以通过nonlocal l
在开头使用func
或__iadd__
直接使用而不是来解决+=
。
问题:这里为什么nonlocal
需要?
这对我来说非常令人惊讶。
python - 非本地关键字如何工作?
在下面的代码中,
python 解释器不series
希望nonlocal
在average()
.
但是在下面的代码中
问题:
为什么 python 解释器期望count
&在中total
声明?nonlocal
average()
python - 如何使用 Python 的 code.interact 获得完整的命名空间?
例如,在 Python (v. 3.6) 中执行 code.interact 时,如何访问完整的命名空间,包括非本地名称?
通常建议使用以下解决方案或类似的解决方案:
code.interact(local={**globals(), **locals()})
但是,这不提供非本地名称(从内部函数看到的外部函数的名称)。事实上,即使是内置函数 dir() 在这方面似乎也很有趣:
在上面的代码中,名称 x 对 dir() 是不可见的,但如果 print(x) 行未注释,则它是可见的。有趣的是 dir() 的语义应该如何取决于它之后发生的事情?!(这是优化还是错误或什么?)那么有没有办法获得所有非本地名称而无需先访问它们?
我宁愿不必编写自己的函数(使用检查或其他)。
function - 将在函数(特定类下)下定义的变量传播到同一类下的其他函数
我有一个代码,其中几乎没有类。在 下SecondClass
,有一个函数叫做plot_image
。在这个函数下,定义了三个变量my_x, my_y, my_z。我试图使这些变量在同一个类中调用的其他一些函数中可访问。这是一个伪代码段形式的非工作示例:get_histogram
global
我尝试了函数顶部的关键字,plot_image
但这并没有为我提供错误信息:
“NameError:名称‘my_x’未定义。”
解决办法是什么?
python - 在非本地范围内使用变量类型注释作为占位符?
由于PEP 526 -- 变量注释的语法被批准,在 Python 3.6+ 中,可以在表单中提供类型提示信息,x: int
PEP 也说“但是,注释局部变量将导致解释器始终使其成为本地变量范围并使变量未初始化”。因此,在 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
部分,这个问题非常接近:
从这个角度来看,它是可以关闭的。事实上,我们无法达成共识,如果我们选择在我们的代码库中使用这种形式,我想听听您对可能存在的陷阱的看法。
python - Python:从外部函数返回后修改非局部变量
考虑以下示例:
内部函数f1
和f2
都在其“闭包”中访问变量in_g
。但是,g
返回后,在in_g
内存中保存在哪里?
我假设在g
执行时,in_g
是堆栈帧上的一个变量,对应于对g
. 因此,g
和f1
都f2
在使用变量时访问相同的内存位置(在堆栈上)in_g
。
但是,如示例中所见,在g
返回之后f1
,f2
在引用in_g
. 但是,现在g
返回了,该内存位置不能再在堆栈上。