请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

闭包的问题

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关键字。

1 回复 有任何疑惑可以回复我~
7七月 2017-11-29 13:34:33

具体报什么错误?

0 回复 有任何疑惑可以回复我~
  • File "c7.py", line 5
        nonlocal origin
        ^
    SyntaxError: no binding for nonlocal 'origin' found
    回复 有任何疑惑可以回复我~ 2017-11-29 13:44:19
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信