如果试图在一个内部函数里对外部作用域(不包括外部函数的外部作用域)的变量进行引用,内部函数就会被认为是闭包。
对于func2函数来说,对在func1函数的整个作用域(func2函数的非全局作用域的外部作用)的变量x进行引用,自此就可以说func2函数就是所谓的闭包。由于闭包本身是基于内部函数的概念,所以不能在外部函数的外部作用域对被不含进行调用。
既然是基于内部函数这一概念而来,自然对于内部函数来说对引用外部函数作用域内的变量进行修改,将会启动解释器的屏蔽机制。x*=x的左值此时是内部函数作用域里的变量,此时试图将没有定义的数据进行平方操作,因此报错。
解决方法1:
应用容器类型(list,tuple之类的)存放外部函数作用域的变量从而不会被屏蔽机制屏蔽掉,因为容器类型不是存放在栈里面。
解决方法2(python3之后的解决办法):
nonlocal关键字