比较正确的做法(应该)
Topic source为啥列表可以,直接赋值不行呢?
def createCounter():
n = 0
def counter():
n = n + 1
return n
return counter
>>> nboundLocalError: local variable 'n' referenced before assignment
个人理解 新计算的n是局部变量,不能外层函数引用
def createCounter():
s=0
defcounter():
nonlocal s
s+=1
return s
return counter
# -*- coding: utf-8 -*-
def createCounter():
r=0
def counter():
nonlocal r #重点 意思和楼上差不多,再白话一点就是楼下参数的不知道r=0,nonlocal的作用是标识该变量是上一级函数中的局部变量
#不知这样理解是不是是否全对(理解有错还请指出)
r+=1
return r
return counter
# 测试:
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
print('测试通过!')
这是因为python解释器无法确定你这个变量是全局变量还是局部变量,无法进行赋值运算,局部变量与全局变量同名了。我开始也是尝试这样用一个变量进行编写,发现报错。后来进行以下尝试,可以正常运行:
def createCounter2():
global defsd
defsd=0
def counter():
global defsd
defsd+=1
return defsd
return counter
这样声明是全局变量以后,两个函数内都引用的是同一个变量defsd。
我觉得闭包,廖大这篇有些敷衍,把简单的复杂化了,建议大家搜搜其它关于闭包的文章,容易了解及运用.评论区看到很多答案都是有运用到nonlocal,和list达到可变,这也是其它文章所讲到的常用的解决方法.而廖大压根没提........
- 1
用户4403728317