#今天阅读廖雪峰大神的python教程,看到返回函数这一部分。他说到:内部函数可以引用外部函数的参数和局部变量。 def col(*arg): res_sum=0 #既然内部函数可以引用外部函数的变量,为什么res_sum没有被内部函数所引用 #? def sum(): for i in arg: res_sum=res_sum+i return res_sum return sum a=col(1,2,3,4,5) print(a()) #但是这个代码就出错了,原因是:local variable 'res_sum' referenced before assignment
#当我修改代码 def col(*arg): def sum(): res_sum=0 #将这句移动到这里就可以了 for i in arg: res_sum=res_sum+i return res_sum return sum a=col(1,2,3,4,5) print(a())
你这里的矛盾在于,你在内部函数里面,又对res_sum进行了赋值,这个时候解释器以为res_sum是局部变量了,不再是全局变量了。 如果不再赋值给res_sum,那解释器就会把res_sum认定为全局变量。 如果要再赋值给res_sum,需要加上global注明,告诉解释器,这里赋值的res_sum不是局部的。
可以引用外部,但是不能直接引用其它函数内的变量。因为函数内变量默认是局部变量。
可以试试加上global
这里我明白了:
其实并不是闭包的问题,比如说这个函数:
def fun1(): a=2 def fun2(): print(a) return fun2() fun1()
运行后完全能显示a的值。
但为什么我问题中就不可以呢?
这是因为:在内部函数中res_sum=res_sum+i 这句就是将外部函数的变量进行修改,这是不被允许的!!如果我们这样修改,那将完全没有问题:
def col(*arg): res_sum=0 def sum(): for i in arg: a=res_sum+i #自定义一个变量a return a return sum a=col(1,2,3,4,5) print(a())