外部函数变量的范围?

时间:2020-07-23 22:18:23

标签: python function scope

对于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()

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

def foo1():
    a = 1

    def foo2():
        global a
        a = -10

    foo2()
    return a


c = foo1()