python - Python 中的局部函数

标签 python function binding model local

在以下 Python 代码中,我得到一个 UnboundLocalError。据我了解,局部函数共享包含函数的局部变量,但这里似乎并非如此。我认识到 a 在这种情况下是一个不可变的值,但这应该不是问题。

def outer():
    a = 0
    def inner():
        a += 1
    inner()
outer()

似乎内部函数已收到父函数中所有引用的副本,因为如果 a 的值为包装在可变类型中。

是否有人能够澄清这里的行为,并指出相应的 Python 文档?

最佳答案

我相信您将其视为“可变性”问题是正确的。虽然您发布的代码确实会引发“UnboundLocalError”,但以下代码不会:

def outer():
    a = 0
    def inner():
        print a
    inner()
outer()

Python 不允许您在内部范围内从外部范围重新分配变量的值(除非您使用关键字“global”,在这种情况下不适用)。

查看此 Python 2.6.2 文档中“类”文档的底部部分:

9.2. Python Scopes and Namespaces

[…] If a name is declared global, then all references and assignments go directly to the middle scope containing the module’s global names. Otherwise, all variables found outside of the innermost scope are read-only (an attempt to write to such a variable will simply create a new local variable in the innermost scope, leaving the identically named outer variable unchanged).

您的“UnboundLocalError”是因为您的函数实际上是在声明一个名为“a”的新变量,然后立即尝试对其执行“+=”操作,但这会失败,因为“a”还没有值。 (将“a+=1”视为“a = a+1”,如果“a”未定义,则可以看出问题)。

一般来说,如果您要修改“a”,人们通常绕过它的方法是使用可变类型来传递“a”(例如列表或字典)。您可以通过可变类型的内容修改“a”(正如您在使用此设置进行测试时可能注意到的那样)。

希望有帮助!

关于python - Python 中的局部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1414304/

相关文章:

python - 格式化文本 (.prn) 文件中的数据

c - 用C语言编写没有指针的合并排序

mysql - 获取插入行的字段值

wpf - 如何像代理一样使用Binding?

python - 在 openshift 上运行无限循环的简单 python 应用程序

python - 优化Python函数调用的性能

python - 让一个类充当元组

我可以将二维数组的单行或单列用作 C 中的单维数组吗?

header 中缺少 C++ ODBC SQL_ATTR_PARAMS_STATUS_PTR

c++ - 符号绑定(bind)如何在 linux 中为共享库工作