【发布时间】:2013-08-29 04:04:02
【问题描述】:
以下闭包函数在 javascript 中运行良好。
function generateNextNumber(startNumber) {
var current = startNumber;
return function(){
return current += 1;
}
}
var getNextNumber = generateNextNumber(10);
for (var i = 0; i < 10; i++) {
console.log(getNextNumber());
}
我尝试在 Python 中做同样的事情
def generateNextNumber(startNumber):
current = startNumber
def tempFunction():
current += 1
return current
return tempFunction
getNextNumber = generateNextNumber(10)
for i in range(10):
print (getNextNumber())
我收到以下错误
Traceback (most recent call last):
File "/home/thefourtheye/Desktop/Test1.py", line 10, in <module>
print (getNextNumber())
File "/home/thefourtheye/Desktop/Test1.py", line 4, in tempFunction
current += 1
UnboundLocalError: local variable 'current' referenced before assignment
当我在tempFunction 中打印vars() 和locals() 时,他们确认current 存在。
({'current': 10}, {'current': 10})
但是当我把程序修改成这样的时候
def generateNextNumber(startNumber):
current = {"Number" : startNumber}
def tempFunction():
current["Number"] += 1
return current["Number"]
return tempFunction
它有效。我无法解释为什么会这样。谁能解释一下?
【问题讨论】:
-
这是 Python 中那些奇怪的小角落之一。我相信它可能已在 Python 3.x 中修复。见stackoverflow.com/a/3190783/646543
-
@Michael0x2a 在 python3.3 中我也得到了相同的结果:(
标签: javascript python closures