为什么范围像这样工作?

时间:2016-06-04 05:52:57

标签: python python-3.x variables scope global-variables

这个问题是我的一个学生询问有关以下代码的问题的结果,而且我老老实实地完全难过了。任何帮助将不胜感激。

当我运行此代码时:

#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'在分配前引用

为什么只有在我想根据原始值将函数内的值更新为新值时才会出现此错误?我不明白的是什么?我觉得这第二段代码应该可以正常工作。

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

2 个答案:

答案 0 :(得分:2)

a = 1

def func3(x):
    global a
    a = x + a
    return(x)

print(func3(3))

现在应该可以了。

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

修改

  

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

答案 1 :(得分:0)

def func3(x):
    a = x + a
    return(x)

在a = x + a(So,x + a)的右侧,'x'作为变量传递,其中'a'不作为变量传递,因此是错误。 不使用全局变量:

    a = 1

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

    func3(3)

返回:5