【问题标题】:Scope of an outer function variable?外部函数变量的范围?
【发布时间】:2020-07-23 22:18:23
【问题描述】:

我对 Python 中外部函数变量相对于内部函数的范围感到困惑。

似乎如果外部函数中的变量是列表或数组,则内部函数可以更改它,而如果它是标量则不能。例如,以下代码给出 c = [0,-10] 的输出。

def foo1():
    a = [0,1]

    def foo2():
        a[1] = -10

    foo2()
    return a


c = foo1()

而下面的代码给出 c = 1。

def foo1():
    a = 1

    def foo2():
        a = -10

    foo2()
    return a


c = foo1()

为什么变量的类型应该有所不同?这和指针有关吗?

【问题讨论】:

  • 对变量的赋值使其默认为本地;您的第二个示例需要foo2() 中的nonlocal a 才能实际引用外部函数的变量。但是a[1] = -10 不是对a 的赋值,它是它的一个突变,所以外部变量被引用。
  • 注意,变量没有类型被变量引用的对象的类型是无关的。使用a = [0, 1],然后在内部函数中执行a = [-10, 1],您将看到相同的行为。在第一种情况下,您正在改变具有局部引用的对象,在第二种情况下,您正在为一个新的局部变量赋值。两种完全不同的东西。我建议阅读以下内容:nedbatchelder.com/text/names.html

标签: python function scope


【解决方案1】:

它和指针没有任何关系,它是如何使用列表的,当你做list[1] = x时,这是一个成员赋值,实际上是一个“方法调用”。基本上,当您更改列表中成员的值时,它会执行方法调用,可以在全局名称空间中找到列表的名称。

【讨论】:

    【解决方案2】:

    在第一个示例中,“a”作为参数传入,因此您可以正常访问或更改它。在第二个示例中,对“a”的任何更改仅保存在内部函数中。要解决此问题,您可以将“a”设为全局:

    def foo1():
        a = 1
    
        def foo2():
            global a
            a = -10
    
        foo2()
        return a
    
    
    c = foo1()
    

    【讨论】:

    • 这不符合预期,在这里,你会想要nonlocal....否则这仍然返回1c
    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多