闭包的问题
来源:11-17 小谈函数式编程
追梦逐梦白日做梦
2017-11-29
origin=0 def go(step): nonlocal origin new_pos=origin+step origin=new_pos return origin print(go(2)) print(go(3)) print(go(6))
为什么我将global origin换成nonlocal origin就不行了呢,nonlocal origin不也是声明origin不是局部变量吗
写回答
2回答
-
python3.0 的 nonlocal 只是让用户对外部作用域的变量重新进行赋值,但是不能对全局作用域的变量进行赋值。
你的Origin是定义在模块外部的,是全局作用域内的变量。本身就是global属性,你不能再对其进行nonlocal绑定。而函数内定义的变量才是局部变量,然后函数内再定义函数时引用外部函数内的变量,这种叫做闭包。但是如果你在最里面的函数内的赋值语句左边使用外部函数内的变量。那么python会认为你是在重新声明一个局部变量。而python里面是没有变量提升的(在JS里面是有的),于是你在定义之前使用这个变量就会报语法错误。于是python3就推出了nonlocal关键字。
112017-11-29 -
7七月
2017-11-29
具体报什么错误?
012017-11-29
相似问题