闭包的问题

来源: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回答

小王子抓猫咪

2017-11-29

python3.0 的 nonlocal 只是让用户对外部作用域的变量重新进行赋值,但是不能对全局作用域的变量进行赋值。

你的Origin是定义在模块外部的,是全局作用域内的变量。本身就是global属性,你不能再对其进行nonlocal绑定。而函数内定义的变量才是局部变量,然后函数内再定义函数时引用外部函数内的变量,这种叫做闭包。但是如果你在最里面的函数内的赋值语句左边使用外部函数内的变量。那么python会认为你是在重新声明一个局部变量。而python里面是没有变量提升的(在JS里面是有的),于是你在定义之前使用这个变量就会报语法错误。于是python3就推出了nonlocal关键字。

1
1
追梦逐梦白日做梦
非常感谢!
2017-11-29
共1条回复

7七月

2017-11-29

具体报什么错误?

0
1
追梦逐梦白日做梦
File "c7.py", line 5 nonlocal origin ^ SyntaxError: no binding for nonlocal 'origin' found
2017-11-29
共1条回复

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14446 学习 · 4438 问题

查看课程

相似问题