为什么范围是这样工作的



这个问题是我的一个学生问了关于以下代码的问题的结果,老实说,我完全被难住了。任何帮助将不胜感激。

当我运行此代码时:

#test 2
a = 1
def func2(x):
    x = x + a
    return(x)
print(func2(3))

它工作得很好。它能够采用全局范围的变量 a 并使用它的值来执行计算并返回值 4。

但是,如果我将其更改为:

# test 3
a = 1
def func3(x):
    a = x + a
    return(x)
print(func3(3))

然后我收到一个错误:

赋值前引用的局部变量"a"

为什么只有当我想根据其原始值将函数中的 a 值更新为新值时,我才会收到此错误?我不明白什么?我觉得第二段代码应该可以正常工作。

提前感谢您的任何帮助和见解。

a = 1
def func3(x):
    global a
    a = x + a
    return(x)
print(func3(3))

现在它应该可以工作了。

当您将语句a=x+a放入函数中时,它会创建一个新的局部变量a并尝试引用其值(显然以前没有定义过)。因此,在更改全局变量的值之前,您必须使用 global a,以便它知道要引用哪个值。

编辑:

函数的执行引入了一个新的符号表,用于 函数的局部变量。更准确地说,所有变量 函数中的赋值将值存储在本地符号表中; 而变量引用首先在局部符号表中查找,然后 在封闭函数的局部符号表中,然后在全局 符号表,最后在内置名称表中。因此,全球 不能在函数中直接为变量赋值 (除非在全局声明中命名),尽管它们可能会被引用。

def func3(x):
    a = x + a
    return(x)
在 a = x + a(因此,x + a)的右侧,"x"作为变量传递,

其中"a"不作为变量传递,因此存在错误。不使用全局变量:

    a = 1
    def func3(x, a=2):
        a = x + a
        return(x)
    func3(3)

返回: 5

相关内容

  • 没有找到相关文章

最新更新