这个问题是我的一个学生问了关于以下代码的问题的结果,老实说,我完全被难住了。任何帮助将不胜感激。
当我运行此代码时:
#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