当前位置: 首页 > 面试题库 >

Python中的局部函数

姚星河
2023-03-14
问题内容

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

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

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

有人可以在这里澄清行为,并为此指出合适的Python文档吗?


问题答案:

我相信您将其视为“可变性”问题是正确的。尽管您发布的代码确实引发了“ UnboundLocalError”,但以下代码却没有:

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

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

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

9.2。Python范围和命名空间

[…]如果声明一个全局名称,则所有引用和赋值将直接转到包含模块全局名称的中间范围。否则,在最内层作用域之外找到的所有变量都是只读的(尝试写入此类变量只会在最内层作用域内创建一个新的局部变量,而使名称相同的外层变量保持不变)。

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

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

希望有帮助!



 类似资料:
  • 通过前面的学习我们知道, Python 函数内部可以定义变量,这样就产生了局部变量,有读者可能会问,Python 函数内部能定义函数吗?答案是肯定的。Python 支持在函数内部定义函数,此类函数又称为 局部函数。 那么,局部函数有哪些特征,在使用时需要注意什么呢?接下来就给读者详细介绍 Python 局部函数的用法。 首先,和局部变量一样,默认情况下局部函数只能在其所在函数的作用域内使用。举个例

  • 问题内容: 我知道它看起来会令人费解,但是请帮助我了解发生了什么。 给出: 所以基本上,为什么我没有得到三种不同的动物?是不是“打包”到嵌套函数的局部作用域中?如果不是,对嵌套函数的调用如何查找局部变量? 我知道遇到这类问题通常意味着一个人“做错了”,但是我想了解会发生什么。 问题答案: 嵌套函数在执行时(而不是在定义时)从父范围中查找变量。 编译函数主体,然后验证“自由”变量(未在函数本身中通过

  • 问题内容: 如果我有一个函数(在Python 2.5.2中)像这样: 我的问题是: 如何在 不 使用函数内部的 locals()的 情况下 从外部 获取 函数的局部变量(a,b)?(反射的种类) 是否可以从外部设置局部变量(例如 x ),以便注释行起作用?(我知道这听起来很奇怪)。 提前致谢。 编辑 : 每个人都在寻找用例。但这是一个奇怪的情况。(不要怪我,我没有创造出来)。这是场景: 我有一个包

  • 当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的 作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。 使用局部变量 例7.3 使用局部变量 #!/usr/bin/python # Filename: func_local.py deffunc(x):     print'x is', x    

  • 问题内容: 此代码为何起作用: 但这给出了“分配前引用的局部变量’var’”错误: 问题答案: 因为在第一个代码中,您已经创建了一个局部变量并使用了它的值,而在第二个代码中,您正在使用局部变量,而没有对其进行定义。 因此,如果要使第二个功能正常工作,则需要声明:- 在使用该功能之前。 而在此代码中: 更新 :- 但是,按照@Tim的注释,您不应在函数内部使用变量。最好在使用变量之前先定义变量,然后

  • 问题内容: 我正在尝试使用exec运行一段python代码。 这导致以下输出 但是,如果我将代码更改为此- 然后工作正常-提供以下输出- 显然,A存在并且可以访问-在第一段代码中出了什么问题?我正在使用2.6.5,欢呼声, 科林 更新1 如果我检查类中的locals()- 然后很明显,locals()在两个地方都不相同- 但是,如果我这样做,就没有问题- 更新2 好的,所以这里的文档-http: